Super Jumping! Jumping! Jumping!
http://acm.hdu.edu.cn/showproblem.php?pid=1087
分析:
简单的动态规划题。题目的意思很直白,其实就是寻找最长递增子序列。
假设dp[i]表示的是从start到达第i个点时可获得的最大分数,data[i]表示的是第i个点的分数值,那么可以得到,
dp[i]= max{dp[i],dp[j]+data[i] },
其中,j<i,且data[j]<=data[i],即j表示的是每一个在i前面且其分数值不大于data[i]的点,计算完dp之后,结果很明显就是dp中的最大值。
AC代码如下:
#include<iostream> #include<algorithm> using namespace std; int main() { int n; int dp[1005],data[1005]; while(cin>>n&&n) { for(int i=1;i<=n;i++) { cin>>data[i]; dp[i]=data[i]; } dp[0]=data[0]=0; int ans=0; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { if(data[j]>data[i]) { dp[j]=max(dp[j],dp[i]+data[j]); } } ans=max(dp[i],ans); } cout<<ans<<endl; } return 0; }