HDU 1087 Super Jumping! Jumping! Jumping!

题意

输入一个数n,后面跟n个数。选择里面的递增的一些数,使其和最大。

分析

dp[i]选择第i个时和最大。很显然要求dp[i]的话必须知道前面最大的那个dp[k],但是有个限制条件就是要递增,也就是说a[k]< a[i],因此遍历一遍前i-1个数,在满足递增条件的数中找到那个最大的dp[k]。状态转移方程 dp[i]=max(dp[k]+a[i])
  这里之前遇到过一个小问题,就是忘记初始化dp数组为a[i]了,因为如果i前面没有满足条件的a[k]的话,那由转移代码可以看出dp[i]是不会被赋值的,但实际上是直接跳到第i个数,那也就是a[i],因此需要提前给这个dp复制a的值

代码

#include <iostream>
using namespace std;
int max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    int n;
    while (cin>>n&&n)
    {
        int dp[1005]={0},number[1005];
        for (int i=0;i<n;i++)
            cin>>number[i];
        dp[0]=number[0];
        //dp数组构建
        for (int i=1;i<n;i++)
        {
            //先给dp赋值
            dp[i]=number[i];
            for (int j=0;j<i;j++)
            {
                if (number[j]<number[i])
                    dp[i]=max(dp[i],dp[j]+number[i]);//状态转移
            }
        }
        //找到dp中的最大值
        int maxn=dp[0];
        for (int i=0;i<n;i++)
            maxn=max(maxn,dp[i]);
        cout<<maxn<<endl;
    }
    return 0;
 } 

猜你喜欢

转载自blog.csdn.net/cugsl/article/details/79114581