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;
}