杭电ACM1003
其实就是简单的子串序列和为最大值的问题,这里采用动态规划法解决这个问题,代码如下:
#include <iostream>
using namespace std;
int main()
{
int T, N, sum, max, a, i, j, l, z, r;
cin >> T;
for(i = 0; i < T; i++)
{
cin >> N;
for(l = z = r = sum = 0, max = -1001, j = 0; j < N; j++)
{
cin >> a;
sum += a;
if(max < sum)
{
l = z;
r = j;
max = sum;
}
if(sum < 0)
{
z = j + 1;
sum = 0;
}
}
cout << "Case " << i + 1 << ":" << endl;
cout <<max << " " << l + 1 << " " << r + 1 << endl;
if(i < T - 1)
cout << endl;
}
return 0;
}
唯一可能有疑问的是为什么max的初始值要设为-1001,这是因为题目要求是N的取值范围是-1000 ~ 1000,所以在这里取max最大值为-1001。