MaxSliceSum:
代码:
|
此题是maxslice的进阶题。事实上就是求A[x]+...+A[z],然后减去A[x],A[y],A[z]后的部分和。和maxsilice的思路一样,我们仍然是通过枚举右边界来更新maxdoubleslice。但有三个点x,y,z,只枚举右边界就能行吗?是的,因为当右边界从i变成i+1时:1、若之前的max_ending为负值,则新的max_ending直接更新成A[i](可找出xyz使得max_ending=A[i])2、若之前的max_ending非负,但A[i]小于A[y],则将y更新成i(y处必须为最小值,因A[y]不会被加入部分和中),max_ending更新成以i为右边界的最大部分和(max_left);否则保持y不变,max_ending更新成max_ending+A[i]。
当左边序列的右边界为i时,max_left更新成max_left+A[i-1]和A[i-1]中较大者。
每次遍历都将max_slice更新为原max_slice和max_ending中较大者,则遍历完成后得到最优解。
代码:
// you can use includes, for example:
#include
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
inline int max(int a,int b,int c)
{
if(a &A) {
// write your code in C++11
if(A.size()<4)
return 0;
//右边界为i时两段最大值max_ending
//中间点为i时左子列最大部分和max_left
//整个数组最大部分和max_slice
int max_ending = 0 , max_left = 0 , max_slice = 0;
for(unsigned int i=3;i