您的位置:首页 > 其它

HDU 1087 Super Jumping! Jumping! Jumping!(dp)

2014-04-29 15:55 281 查看
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1087
题意:

求一串序列的最大的递增子序列的和。N<=1000

题解:

动态规划,用dp[i]表示以第i个数为结尾的最大递增数列和。假设只有一个数的时候,例如10,dp[1]显然为10,假设有三个数,10,1,3,dp[1]=10,dp[2]初始值为1,即只有自身作为子序列,然后再判断是否更新,即与在它之前的序列结尾比较,若递增则更新为衔接后的结果。设value[i]为第i个数值,因为value[2]<value[1]就不能更新,则dp[2]的结果为1,dp[3]初始化为value[3]=3,判断更新,value[3]>value[2],则更新dp[3]=d[2]+value[3]

代码:

#include<cstdio>
#include<cstring>
int dp[1001];
int value[1001];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int i;
if(n==0) break;
for(i=1;i<=n;i++)
{
scanf("%d",&value[i]);
}
memset(dp,0,sizeof(dp));
dp[1]=value[1];
int ans=dp[1];
for(i=2;i<=n;i++)
{
int j;
dp[i]=value[i];
for(j=1;j<i;j++)
{
if(value[j]<value[i])
{
dp[i]=max(dp[i],dp[j]+value[i]);
}
}
if(ans<dp[i]) ans=dp[i];
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: