HDU--1087 求最长递增子序列的和(DP)

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1087

 

    题意:这个样例很误导人啊,这个题意呢,就是从起点跳到终点,保持递增跳而且得分最大。注意,起点和终点是不计分的;

    解析:模板改一下就好了,之前求的是序列长度。这里求和,那么只要把dp初始化a[ ],依然还是探讨每个数选还是不选的问题。转移方程:

  if(a[i]>a[j])
  dp[ i ]=max(dp[ i ],dp[ j ]+a[ i ])
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1e6+10;
typedef long long ll;
ll a[maxn];
ll dp[maxn];
int main()
{
    ll n ;
    while(cin>>n)
    {
        if(n==0)    
            break;
        for(int i =0  ; i<n;i++)
            cin>>a[i];
        for(int i=0;i<n;i++)
            dp[i]=a[i];
        ll maxx=-1;
        ll sum = 0;
        for(int i = 1 ;i <n ; i++)
        {
            for(int j = 0 ; j< i; j++)
            {
                if(a[i]>a[j])
                {
                    dp[i]=max(dp[i],dp[j]+a[i]);
                }
            }
            maxx=max(dp[i],maxx);
        }
        cout<<maxx<<endl;
    }
}

 

posted @ 2020-04-11 23:38  liyexin  阅读(190)  评论(0编辑  收藏  举报