D题 最长上升子序列的和
来源:互联网 发布:gta5n卡优化驱动 编辑:程序博客网 时间:2024/06/03 08:31
#include <iostream>using namespace std;#include<cstdio>#define GetMax(a,b) a>b?a:b#define Big __int64Big dp[1005]={0};int main(){ Big Max; int i,j,n,val[1005]={0}; while (scanf("%d",&n),n) { for(i=1;i<=n;i++) scanf("%d",&val[i]),dp[i] = 0; dp[1] = val[1]; for (i=1;i<=n;i++) { for (j=i+1;j<=n;j++) { if (val[j]>val[i]) dp[j] = GetMax(dp[j],dp[i]+val[j]); else if(dp[j]==0)/*之前没有比它小的数,则最大和为自己本身*/ dp[j] = val[j]; } } Max = -1; for (i=n;i>=0;i--) { cout<<dp[i]<<' '; if(Max<dp[i]) Max = dp[i]; } cout<<endl; printf("%I64d\n",Max); } return 0;}