题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087
题目大意:给你一个起点跟终于,中间一条路,路上每个点各有一个类似分值一样的东西,可以跳着走,也可以连续走,规则就是你走的一个要比前一个数值大,求从起点到终点可以得到的最大分数。
解法:
其实就是给你n个数,求最大的子序和。跟最长上升子序列有点像,但不一样。
dp[i]=max( dp[i] , dp[k]+a[i] ) (a[i]>a[j] && k<i )
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=1e3+10; int a[maxn],dp[maxn]; int main() { int n; while (scanf("%d",&n),n) { for(int i=0;i<n;i++) scanf("%d",a+i); memset(dp,0,sizeof(dp)); int ans=0; for(int i=0;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]); ans=max(ans,dp[i]); } cout<<ans<<endl; } }