Description
Input
Output
Sample Input
3 1 3 2 4 1 2 3 4 4 3 3 2 1 0
Sample Output
4 10 3
题意:一开始对题意不是很明确,看了别人的翻译才明白题目的意思。
知识点:最大上升子序列求和。。。从前往后搜
状态转移方程:dp[i]=max(dp[i],dp[j]+a[i])
AC代码:
解法一:
#include<iostream>
#include<cstdio>
#include<cstring>
int dp[1005],a[1005];
int main ()
{
    int n,i,j,max;
    while(scanf("%d",&n)!=EOF&&n)
    {
        max=-999;
        memset(a,0,sizeof(a));
        for(i=1;i<=n;i++)
            scanf("%d",&a[i]);
            memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)
        {
         dp[i]=a[i];
                for(j=1;j<=i;j++)
            {
                if(a[j]<a[i]&&dp[i]<dp[j]+a[i])//状态转移方程:dp[i]=max(dp[i],dp[j]+a[i])
                   dp[i]=dp[j]+a[i];
            }
            if(max<dp[i])
                max=dp[i];
        }
        printf("%d\n",max);
    }
    return 0;
}
解法二:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[1005],d[1005];
int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int n,sum;
    memset(d,0,sizeof(d));
    while(~scanf("%d",&n)&&n)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
            for(int i=1;i<=n;i++)
            {
                sum=-999;
            for(int j=0;j<i;j++)
            {
                if(a[i]>a[j])
                    sum=max(d[j],sum);
            }
            d[i]=sum+a[i];
            }
        sum=-999;
        for(int i=1;i<=n;i++)
        {
            if(sum<d[i]) sum=d[i];
        }
       printf("%d\n",sum);
    }
    return 0;A - Super Jumping! Jumping! Jumping!
原文:http://www.cnblogs.com/lbyj/p/5758037.html