1.简单题意
给出一个数列a[1],a[2],a[3].a[n],你的工作是计算这个子数列的最大和.例如,给出数列(6,-1,5,4,-7),那么这个数列的最大和就是6 + (-1) + 5 + 4 = 14.
2.解题思路
这是利用动态规划求最大子串和的问题,
本题的子问题是:dp[i] 代表前i个数中最大子串的和 ;
通过递归或递推求出子问题的最优解。
本题中的状态转移方程为:if ( dp[i-1] < 0 )
3.AC代码
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int i, ca = 1, t, s, e, n, x, now, before, max;
cin >> t;
while (t--)
{
cin>>n;
for (i = 1; i <= n; i++)
{
cin>>now;
if (i == 1)
{
max = before = now;
x = s = e = 1;
}
else {
if (now>now + before)
{
before = now;
x = i;
}
else before += now;
}
if (before>max)
max = before, s = x, e = i;
}
cout << "Case " << ca++ << ":" << endl;
cout << max << " " << s << " " << e<<endl;
if (t)cout<<endl;
}
return 0;
}