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

来源:互联网 发布:淘宝火拼入口 编辑:程序博客网 时间:2024/04/26 06:30
题目:

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;}


0 0
原创粉丝点击