HDU1087 - Super Jumping! Jumping! Jumping! - 最大上升子序列和模板题
题意
求给定数组中最大上升子序列和
比如样例:
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;
}