问题 E: 积木

时间限制: 1 Sec 内存限制: 128 MB
提交: 36 解决: 14
[状态] [提交] [命题人:admin]
题目描述
乔治喜欢玩积木。目前他有N块积木,编号为1到N。所有积木的高度都是正整数,第i块积木高度是H[i]。乔治喜欢用积木堆起尽可能高的塔。他堆积木的过程中,只需要同时满足如下三个规则:
(1)积木必须堆放在同一个列中,一个搭在另一个上面。最终的塔的高度就是构成塔的所有积木的高度总和。
(2)塔中使用的积木的编号从底部到顶部必须是递增的。换句话说,每当乔治把积木x放在积木y的上面,必须要满足编号x大于编号y。
(3)乔治永远不会把高度是偶数的积木放置在高度是奇数的积木上面。

在满足上面的前提下,塔最高是多高?
输入
多组测试数据。
第一行,一个整数G,表示有G组测试数据。1<=G<=5。每组测试数据格式如下:
第1行,一个正整数N。2<=N<=50。
第2行,N个正整数,空格分开,第i个整数就是编号为i的积木的高度H[i],1<=H[i]<=50。
输出
共G行,每行一个正整数。
样例输入 Copy
5
2
4 7
2
7 4
1
7
1
4
7
48 1 50 1 50 1 48
样例输出 Copy
11
7
7
4
196
提示
对于第5组测试数据的解释:
从底部往顶部,依次选择第1、第3、第5、第7块积木,这样塔的高度是:48+50+50+48=196。

本人由于不会dp直接做了。上代码吧。

#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int main() {
    int n,i,j,m,s,c,G,sum,t,k,t1,t2;
    scanf("%d",&G); 
    int a[100],b[100];
    while(G--){
        sum=0;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
        scanf("%d",&a[i]);
        if(a[i]%2==1)
        b[i]=1;
        else b[i]=0;
        }
        t=n;
        c=0;
        while(1){
            if(t==0)
            break;
            sum=0;
            for(i=1;i<=t;i++)
            if(b[i]==0)
            sum+=a[i];
            for(i=t;i<=n;i++)
            if(b[i]==1)
            sum+=a[i];
            c=max(c,sum);
            t--;
        }
    printf("%d\n",c);
    } 
    return 0;
}