思路:
用dp[i][j] 来表示前i个数操作了j次的最小和,然后对于每个a[i],我们分别枚举i前面操作了x次以及后面操作了j次,对于每次操作,都是将一段区间全换位区间最小值.
代码:
void solve(){
int n, k;
cin >> n >> k;
int sum = 0;
vector<int>a(n + 1);
for(int i = 0;i < n;i ++)
cin >> a[i];
vector<vector<int>>dp(n + 1, vector<int>(k + 1, 1e18));
dp[0][0] = 0;
for(int i = 0;i < n;i ++){
int mi = a[i];
for(int j = 0;j + i < n && j <= k;j ++){
mi = min(mi, a[i + j]);
for(int x = 0;x + j <= k;x ++){
dp[i + j + 1][x + j] = min(dp[i + j + 1][x + j], dp[i][x] + mi * (j + 1));
}
}
}
cout << *min_element(dp[n].begin(), dp[n].end()) << endl;
}