我思维比较差,平时也不敢碰dp,但是没办法必须学。这题虽然做了很久,修修改改很久,但是最后做出了,还是很好地。
对于如果a[j]>a[i],并且j>i,那么i能跳到j,那dp[j]=max(dp[i]+a[j],dp[j]);如果不能跳转dp[j]=max(dp[j],a[j]);保证dp[j]最大。
#include<stdio.h> #include<string.h> #define maxn 1100 int max(int x,int y) { return x>y?x:y; } int main() { int i,j,n,dp[maxn],a[maxn]; while(scanf("%d",&n)!=EOF) { if(!n)break; for(i=1;i<=n;i++) { scanf("%d",&a[i]); dp[i]=a[i]; } dp[0]=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(a[i]<a[j]&&j>i)//从i跳到j { dp[j]=max(dp[i]+a[j],dp[j]); } else dp[j]=max(dp[j],a[j]);//不能跳转 选取最大的。 } int ans=-999999; for(i=1;i<=n;i++) if(dp[i]>ans) ans=dp[i]; printf("%d ",ans); } }