HDU1087

题意

求给定数组中最大上升子序列和

比如样例:

4
5 1 2 10 -> 15

思路

模板题,dp写。

注意

需要注意的地方写在代码里了。

关于写dp的题目,一定要有个全局观和注意细节,一些边界条件需要多想想多去判断一下,并且去考虑有没有条件根本就不在大部分要求中,需要我们特殊判断的。还有就是关于初始化的问题,一定要判断清楚赋值为哪个数。

AC代码

#include<bits/stdc++.h>
using namespace std;

int dp[1010],a[1010];

int main()
{
    int n;
    while(~scanf("%d",&n)&&n)
    {

        for(int i=0; i<n; i++)
            cin>>a[i],dp[i]=a[i];
        int ans=0;
        //如果下面的ans=max(ans,dp[i])是写在最内层的
        //那么ans需要=dp[0],因为dp[0]这个数据没有进入第二层循环
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<i; j++)
            {
                if(a[j]<a[i])
                    dp[i]=max(dp[j]+a[i],dp[i]);
            }
            ans=max(ans,dp[i]);
        }
        cout<<ans<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/OFSHK/p/14667793.html