第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(5、猴子拿桃)
参考程序:
#include <bits/stdc++.h>
using namespace std;int main() {int N, K;cin >> N >> K;vector<int> a(N);for (int i = 0; i < N; ++i) cin >> a[i];const int NEG = -1000000000; // 当状态不可能时用这个很小的数表示// dp[i][t] : 最后一次取的是第 i 筐(0-based),共取了 t 次时的最大和vector<vector<int>> dp(N, vector<int>(K + 1, NEG));// 初始化:t = 1for (int i = 0; i < N; ++i) dp[i][1] = a[i];// 递推:t 从 2 到 Kfor (int t = 2; t <= K; ++t) {for (int i = 0; i < N; ++i) {int best = NEG;// 前一次选的位置 p 必须 < i,且 a[p] <= a[i]for (int p = 0; p < i; ++p) {if (a[p] <= a[i] && dp[p][t - 1] != NEG) {best = max(best, dp[p][t - 1] + a[i]);}}dp[i][t] = best;}}int ans = NEG;for (int i = 0; i < N; ++i) ans = max(ans, dp[i][K]);if (ans == NEG) cout << 0 << "\n";else cout << ans << "\n";return 0;
}