【DP】HDU 1087

HDU 1078 Super Jumping! Jumping! Jumping!

题意: 有这么个游戏,从start到end(自己决定在哪停下来)连续跳圈,中间不能空一个圈不跳,圈里的数字必须比你上次跳到圈里的数字大,最后求你所有路过的圈中数字总和最大。
思路:很明显的最长上升子序列之和,状态方程就是:

dp[i] = max(dp[i],dp[j]+a[i])(a[i]>a[j],且i>j,dp[i]是i当前最优状态)

/**
Sample Input
3 1 3 2
4 1 2 3 4
4 3 3 2 1
0 

Sample Output
4
10
3 
**/

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[1005];
int a[1005];
int main(){
    int n;
    while(~scanf("%d",&n)){
        if(!n) break;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        int res = 0;
        for(int i=0;i<n;i++){
            dp[i] = a[i];
            for(int j=0;j<i;j++){
                if(a[i]>a[j]){
                    dp[i] = max(dp[i],dp[j]+a[i]);
                }
            }
            res = max(res,dp[i]);//每次保存最优
        }
        printf("%d\n",res);
    }
    return 0;
}
posted @ 2016-04-15 12:40  霜降sma  阅读(91)  评论(0编辑  收藏  举报