水题一枚,乍看还以为是最长上升子序列,其实也差不多啦
//dp[i]表示到达第i个点时能取得的最大分值,注意这里是到达该点,而不是前i个点
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[1005],a[1005];
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int n;
while(scanf("%d",&n),n){
memset(dp,0,sizeof(dp));
a[0]=0;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
dp[i]=a[i];
for(int j=0;j<i;j++){
if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+a[i]);
//如果a[i]<=a[j]则由a[j]不能到达该点,则dp[i]保留原值
}
}
int ans=0;
//for(int i=1;i<=n;i++) printf("%d ",dp[i]);
for(int i=1;i<=n;i++) ans=max(dp[i],ans);
printf("%d\n",ans);
}
}HDU 1087 Super Jumping! Jumping! Jumping!
原文地址:http://blog.csdn.net/lj94093/article/details/45276543