思路:
用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;
}