题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087
题目大意:在一段序列中,按照从小到大的顺序找子序列,要求得到的sum 值最大。
思路:其实就是最长公共子序列。
#include<stdio.h> #include<string.h> #define max(a,b) a>b?a:b int main() { int n,i,j,k,a[1005],dp[1005],x,ans; while(scanf("%d",&n)!=EOF) { if(n==0)break; ans=0; for(i=1;i<=n;i++) {scanf("%d",&a[i]); dp[i]=a[i]; //初始化 } for(i=1;i<=n;i++) { for(j=1;j<i;j++) { if(a[i]>a[j])dp[i]=max(dp[i],dp[j]+a[i]); } if(ans<dp[i])ans=dp[i]; } printf("%d\n",ans); } return 0; }
#include<stdio.h> #include<string.h> #define max(a,b) a>b?a:b int n,a[1005],dp[1005]; void dfs(int x) { for(int i=1;i<=n;i++) { int xx=x+i; if(xx>n)continue; if(a[xx]>a[x]){ if(dp[xx]==0){ dfs(xx); dp[x]=max(dp[x],dp[xx]+a[x]); } else dp[x]=max(dp[x],dp[xx]+a[x]); } } if(dp[x]==0)dp[x]=a[x]; return ; } //记忆化搜索 int main() { int i,j,maxi; while(scanf("%d",&n)!=EOF) { maxi=0; if(n==0)break; for(i=1;i<=n;i++) scanf("%d",&a[i]); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { dfs(i); // printf("%d\n",dp[i]); if(maxi<dp[i])maxi=dp[i]; } printf("%d\n",maxi); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
Hdu 1087 Super Jumping! Jumping! Jumping!(DP)
原文:http://blog.csdn.net/aaaaacmer/article/details/47984365