动态规划题目做的真的很少,自己也不太熟练,这题也是连蒙带猜才弄出来。
dp[i]表示以data[i]结尾的最大分数,那么状态转移方程为:dp[i]=max(dp[j]+data[i],data[i])(0<j<i)。
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<cmath> using namespace std; const int N=1002; const int inf=1<<28; int dp[N],data[N]; int main() { int n; while(scanf("%d",&n),n!=0) { for(int i=1;i<=n;i++) { scanf("%d",&dp[i]); data[i]=dp[i]; } for(int i=2;i<=n;i++) { int t=data[i]; for(int j=1;j<i;j++) { if(data[i]>data[j]) { if(t<dp[i]+dp[j]) t=dp[i]+dp[j]; } } dp[i]=t; } int ans=-inf; for(int i=1;i<=n;i++) if(ans<dp[i]) ans=dp[i]; printf("%d\n",ans); } return 0; }
HDU 1087 Super Jumping! Jumping! Jumping!
原文:http://blog.csdn.net/u013621213/article/details/43496743