题解 P7241 【[COCI2019-2020#4] Holding】
题解
容易发现交换
我们考虑在最终序列里,有哪些元素被选择进
那么
直接暴力转移,时间复杂度为
参考代码
#include<bits/stdc++.h>
#define up(l, r, i) for(int i = l, END##i = r;i <= END##i;++ i)
#define dn(r, l, i) for(int i = r, END##i = l;i >= END##i;-- i)
using namespace std;
typedef long long i64;
const int INF = 1e9 + 1;
const int MAXN= 100 + 3;
const int MAXM= 1e4 + 3;
int F[2][MAXN][MAXM], o, n, m, l, r, t, A[MAXN];
int qread(){
int w = 1, c, ret;
while((c = getchar()) > '9' || c < '0') w = (c == '-' ? -1 : 1); ret = c - '0';
while((c = getchar()) >= '0' && c <= '9') ret = ret * 10 + c - '0';
return ret * w;
}
int main(){
n = qread(), l = qread(), r = qread(), m = qread();
t = r - l + 1;
up(1, n, i) A[i] = qread();
up(0, t, i) up(0, m, j)
F[0][i][j] = F[1][i][j] = INF;
F[o][0][0] = 0;
up(1, n, i) {
up(0, t, j) up(0, m, k){
int w = abs(l + j - i - 1);
F[!o][j][k] = F[o][j][k];
if(k >= w && j >= 1)
F[!o][j][k] = min(F[!o][j][k], F[o][j - 1][k - w] + A[i]);
}
o ^= 1;
}
int ans = INF;
up(0, m, i) ans = min(ans, F[o][t][i]);
printf("%d\n", ans);
return 0;
}