显然这题可以用动态规划求解,而且发现只与上一个状态有关,所以可以滚动,详情看代码
int n, k;
rd(n, k);
vector<int> a(n + 1);
for (int i = 1; i <= n; i++) rd(a[i]);
ll cdp1 = 0, cdp0 = 0, ldp1 = 0, ldp0 = 0;
for (int i = 1; i <= n; i++) {
int bi; rd(bi);
if (ldp1) cdp1 = ldp1 + bi;
if (ldp0 >= k) cdp1 = max(cdp1, ldp0 + bi - k);
cdp0 = ldp0 + a[i];
if (ldp1 >= k) cdp0 = max(cdp0, ldp1 + a[i] - k);
ldp1 = cdp1;
ldp0 = cdp0;
}
println(max(cdp1, cdp0));

京公网安备 11010502036488号