这题,简单的动态规划,也就是求最大连续子序列的和,是和最大。
知道了这个,就可以很容易的写出代码来了。
状态转移方程: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;
}