输入一个长度为n的整数序列a1,a2,...an。你的任务是恰好选择两个非空子段。子段是指原序列中的连续一段。这两个子段不能有重复部分,且他们之间相隔必须大于K。例如,选择子段[1,5]和[8,10]在K=2时合法,但是在K≥3时就不合法了。
你需要最大化你选择的这两个子段内的整数之和。请求出这个最大值。
定义dp[i]为以i结尾的(1,i)范围内的最大子段和,定义udp[i]为以i为起点,(i,n)范围内的最大子段和,那么根据题意,全局最大两段不重叠的子段和即为res=max(res,dp[i]+udp[i+k+1])
注意i+k+1需小于等于n
c++
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
signed main()