题目链接: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