hdu-1087(动态规划)

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

思路:每确定一个数,后面一个数肯定比它大。所以可以先从最后一个数开始,不断向前确定前面的状态,推导出

状态转移方程为:dp[i] = dp[i]+max(dp[j]) (j<i&&a[j]<a[i])。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn = 1200;
int a[maxn],dp[maxn];
int main(void)
{
    int i,j,n;
    while(~scanf("%d",&n)&&n)
    {
        for(i=0;i<n;i++) scanf("%d",&a[i]);
        for(i=0;i<n;i++) dp[i]=a[i];
        for(i=n-2;i>=0;i--)
        {
            int tp=0;
            for(j=i+1;j<n;j++)
            {
                if(a[j]>a[i]&&dp[j]>tp)
                tp=dp[j];
            }
            dp[i]+=tp;
        }
        int ans=0;
        for(i=0;i<n;i++)
        {
            if(ans<dp[i]) ans=dp[i];
        }
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/2018zxy/p/9936194.html