现在的位置: 首页 > 综合 > 正文

hdu 1087 Super Jumping! Jumping! Jumping! (DP)

2014年09月05日 ⁄ 综合 ⁄ 共 586字 ⁄ 字号 评论关闭

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087

题目大意:给你一个起点跟终于,中间一条路,路上每个点各有一个类似分值一样的东西,可以跳着走,也可以连续走,规则就是你走的一个要比前一个数值大,求从起点到终点可以得到的最大分数。

解法:

其实就是给你n个数,求最大的子序和。跟最长上升子序列有点像,但不一样。

dp[i]=max( dp[i] , dp[k]+a[i] )  (a[i]>a[j]  && k<i )

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e3+10;
int a[maxn],dp[maxn];
int main()
{
    int n;
    while (scanf("%d",&n),n)
    {
        for(int i=0;i<n;i++) scanf("%d",a+i);
        memset(dp,0,sizeof(dp));
        int ans=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]);
            ans=max(ans,dp[i]);
        }
        cout<<ans<<endl;
    }
}

抱歉!评论已关闭.