题目:hdu 1087 Super Jumping! Jumping! Jumping!
题目类型描述: 1、求一个上升子序列,2、子序列的和最大
题解: 其实和最长上升子序列中动态规划的思想类似,动态转移方程都差不多的,只不过一个是以序列长度为基础,一个是以序列和为基础。可以先看一下最长上升子序列(LIS)的思路。
对比:
转移方程 | dp的初始化 | |
---|---|---|
最长上升子序列 | dp[i]=max(dp[i],dp[j]+1) | dp[i]=1 |
最大上升子序列和 | dp[i]=max(dp[i],dp[j]+a[i]) | dp[i]=a[i] |
代码:
#include <iostream>
#include <iostream>
#include <string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int manx=1e5+10;
const int INF=0x3f3f3f3f;
int main()
{
long long n,a[1010],dp[1010],mmax,ans;
while(scanf("%lld",&n),n)
{
for(int i=1; i<=n; i++)
scanf("%lld",&a[i]);
dp[1]=a[1];
ans=a[1];
for(int i=2; i<=n; i++)
{
dp[i]=a[i];
for(int j=1; j<i; j++)
{
if(a[j]<a[i])
dp[i]=max(dp[i],dp[j]+a[i]);
}
ans=max(ans,dp[i]);
}
printf("%lld\n",ans);
}
return 0;
}