这题,简单的动态规划,也就是求最大连续子序列的和,是和最大。
知道了这个,就可以很容易的写出代码来了。
状态转移方程:dp[i] = max{ dp[j] } + a[i] ( j >= 0 && j < i)
有了状态转移方程,一切都是很简单了。
下面的是一次AC的代码:
#include <iostream> using namespace std; int main() { int dp[1005], a[1005]; int n, i, j; while(scanf("%d", &n) != EOF && n != 0) { memset(dp, 0, sizeof(dp)); for(i = 0; i < n; i++) { scanf("%d", &a[i]); } for(i = 0; i < n; i++) //动态求解 { int k = -1; int max = -100000; for(j = 0; j < i; j++) //找0到i之间最大的和 { if(a[i] > a[j] && dp[j] > max) //判断条件 { k = j; max = dp[j]; } } if(k >= 0) //存在,加上a【i】 dp[i] += dp[k] + a[i]; else //不存在 dp[i] += a[i]; } int ans = -100000; for(i = 0; i < n; i++) //找最大的和 { if(dp[i] > ans) ans = dp[i]; } cout << ans << endl; } return 0; }
杭电ACM1087——Super Jumping! Jumping! Jumping!
原文地址:http://blog.csdn.net/qq_25425023/article/details/45457827