hdu 1087 Super Jumping! Jumping! Jumping!(动态规划DP)

题目大意:求解最大递增子序列和,这里要特别注意一点:这个题目不要求是连续的最大递增子序列。但是一定要注意是递增的!!

题目思路:dp数组表示是包含当前这个数的最大递增子序列和。dp[i]表示的是前i个并且包含第i个的最大递增子序列和!给个数据:3 1 4 显然dp[1]=3,dp[2]=1表示两个数的最大值。因为分两种情况讨论,如果第二个数大于第一个数,就加上,即dp[2]=dp[1]+num[2];如果不大,dp[2]=num[2];dp[3]=7表示三个数的最大值。首先比较num[3]和num[1],如果num[3]>num[1],dp[3]=7先存下来,如果num[3]>num[2],dp[3]=5依旧存下来;还有一种如果num[3]比前两个值都小,dp[3]=num[3];最后在存下来的dp[3]中找到一个最大的!

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int num[1010],dp[1010];

int main ()
{
    int n,Max;
    while (~scanf("%d",&n))
    {
        if (n==0)
            break;
        Max=0;
        memset(dp,0,sizeof(dp));
        for (int i=0;i<n;i++)
        {
            scanf("%d",&num[i]);
        }
        dp[0]=num[0];
        for (int i=1;i<n;i++)
        {
            for (int j=0;j<i;j++)
            {
                if (num[i]>num[j])
                dp[i]=max(dp[i],dp[j]+num[i]);
            }
            dp[i]=max(dp[i],num[i]);  //这步我的理解是 8 1 2 还是不太懂 反正再和num[i]再比较下吧 num[3]比前两个值都小 这种吧
        }
        for (int i=0;i<n;i++)
        {
            Max=max(Max,dp[i]);
        }
        printf ("%d\n",Max);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/cgmm2333/article/details/81604486