晓轩

博客园 首页 联系 订阅 管理

输入:3    1 3 2

        4    1 2 3 4

        4    3 3 2 1

        0

输出:4

        10

        3

思路:dp[i]记录以a[i]结尾的序列的最大递增子序列的和,dp[1],dp[2]...dp[n]中的最大值即为所求。

#include<iostream>
#include<cstring>
using namespace std;

const int MAX=1005;

int a[MAX],dp[MAX];

int MaxSum(int *a,int n)
{
 int i,j,maxsum;
 for(i=0;i<n;i++)
  dp[i]=a[i];
 maxsum=dp[0];
 for(i=1;i<n;i++)
  for(j=0;j<i;j++)
  {
   if(a[i]>a[j]&&dp[i]<dp[j]+a[i])
    dp[i]=dp[j]+a[i];
   if(maxsum<dp[i])
    maxsum=dp[i];
  }
 return maxsum;
}

int main()
{
 int n,idx;
 while(cin>>n&&n)
 {
  for(idx=0;idx!=n;++idx)
   cin>>a[idx];
  cout<<MaxSum(a,n)<<endl;
 }
 return 0;
}

posted on 2013-07-16 21:35  晓轩  阅读(567)  评论(0)    收藏  举报