hdu 1087

hdu 1087
这道题是用dp做出来的,也算是很巧妙的方法。。。。

思路:首先第一个for遍历1-n,这个时候先设一个flag=0

然后在遍历从1到i,因为题目求得是单调最长序列的和

所以j每次都要在i前面,然后在满足啊a[i]>a[j]的情况下

用flag记下j前面序列和的最大值,在遍历完j后

此时flag存储了1-j中最大的sum和,此时,只要一步

把a[i]加上,就可以表示sum[i]的总和。。。。

所以最后只要判断sum序列中,最大的值就可以。。。。

 

 

#include <iostream>
#include <cstring>
//#define MAX(a,b) a>b?a:b
using namespace std;
int main()
{
    int i,sum[1000],a[1000],n,j;
    while(cin>>n&&n)
    {
        for(i=1;i<=n;i++)
            {cin>>a[i];
            sum[i]=0;}
        for(i=1;i<=n;i++)
        {
            int flag=0;
            for(j=i-1;j>=1;j--)
            if(a[i]>a[j]&&flag<sum[j])
                flag=sum[j];
            sum[i]=a[i]+flag;
        }
        int Max=sum[1];
        for(i=2;i<=n;i++)
            if(Max<sum[i])  Max=sum[i];
        cout<<Max<<endl;
    }
    return 0;
}

posted @ 2014-12-11 14:54  __夜风  阅读(143)  评论(0编辑  收藏  举报