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