水题一枚,乍看还以为是最长上升子序列,其实也差不多啦
//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