HDU 1087 Super Jumping! Jumping! Jumping!

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1087

 

解题思路:

这是单最长调递增子序列的一个变形

d[i]:表示以a[i]结尾的序列和的最大值。

因此定义下面的状态方程:

在初始以d[i]结尾的序列只有a[i]一个,因此d[i]=a[i].

实现代码:

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

const int MAXN=2005;
const int INF=1<<20;
int End,n;
int a[MAXN];
int dp[MAXN];

/******************************************
dp[i]:表示以a【i】结尾,单调递增序列和的最大值
******************************************/
void solve(){

    int res=-INF;
    for(int i=0;i<n;i++){
        dp[i]=a[i];
        for(int j=0;j<i;j++){
            if(a[j]<a[i])
                dp[i]=max(dp[i],dp[j]+a[i]);
        }
        res=max(dp[i],res);
    }
    cout<<res<<endl;
}

int main(){
    while(scanf("%d",&n)!=EOF&&n){
        for(int i=0;i<n;i++)
            scanf("%lld",&a[i]);
        solve();
    }
    return 0;
}
自己选的路,跪着也要把它走完------ACM坑
原文地址:https://www.cnblogs.com/IKnowYou0/p/6603328.html