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