这题需要利用动态规划来解决,也可能会考到数组越界的问题。不用想太复杂,就是求出每个子序列的值然后与之前的最大值比较大小(当然前子序列为负值则把清为零),最终运行出来的就是最大值。
#include <iostream>
using namespace std;
static int a[100001];
int main()
{
int T = 0;
cin >> T;//输入的第一行包含一个整数 T(1<=T<=20),表示测试用例的数量
for (int i = 1; i <= T; i++)
{
cin >>a[0];//输入这个开头的数N
int Sum = 0, b = -1001, r = 1, m, M;//“Sum”子序数的和值(记住不是最大值);“b”是最大值,在这里从最小开始,通过替换得到最后的最大值;“r”是最初的序列值;“m”是起始的序列值;“M”是最末尾的序列值
for (int i = 1; i <= a[0]; i++)
{
cin >> a[i];//输入N个整数
}
for (int i = 1; i <= a[0]; i++)
{
Sum += a[i];//子序列的和
if (Sum > b)//比较这这个子序列和最大值,当这个子序列的和值大于了最大值则交换
{
b = Sum;//
m = r;//起始的序列值则与最初序列值交换
M = i;//末尾的序列值则与i(i为子序列的末端)交换
}
if (Sum < 0)//当这个子序列的值小于零则舍弃
{
r = i + 1;//初始的序列值就变为末尾的序列值加一,但是不代表起始序列值加一
Sum = 0;
}
}
cout << "Case"<< i<< ' ' <<":" << endl;
cout << b << ' ' << m <<' ' << M << endl;
}
return 0;
}
当然方法并不唯一,如果有更好的方法可以分享一下!