1589 - 最大部分和(连续部分和)
题目描述
有 n 个整数(1≤n≤100),排成一排,例如:
n=7
−2 13 12 9 14−10 2 (7个整数)
其最大的部分和为 4848 (即 13+12+9+1413+12+9+14)。
输入
第一行一个整数 n;
第二行 n个整数 xi(−100≤xi≤100);
第二行的数之间有一个空格;
输出
一个整数(即最大的连续的部分和)。
样例
输入
7
-2 13 12 9 14 -10 2
输出
48
【来源】
2014江苏省青少年信息学奥林匹克竞赛复赛。
#include<iostream>
using namespace std;
int a[110], dp[110], n;
int main()
{
int i,sum=0;
cin >> n;
for (i = 1; i <= n; i++)
{
cin >> a[i];
}
for (i = 1; i <= n; i++)
{
dp[i] = max(a[i], dp[i - 1] + a[i]);//利用dp数组存储从每个i坐标开始的最大值
//若加上ai不如ai本身大,说明前面的求和已经是负收益了,
//如果再和ai求和的话,会拖累ai这么好的一个材料,
//则dpi改为ai的数值
//dpi大于ai的情况下,不能仅仅因为ai是一个负数,
//就不加了,因为后面可能会迎来转机(能够加上后弥补ai是个负数的不足,
//即ai+1和ai求和的结果又是个正数,则把它俩一块加上后就又是正收益了)
sum = max(dp[i], sum);//反悔操作
//如果在dpi大于ai的情况下,加上ai及ai后面的数都不如不加的大
//(及ai和后面任意数求和的结果都是负数,那么带上ai就是负收益了)
//此时进行反悔,回到最辉煌的时候
}
cout << sum;
return 0;
}