代码改变世界

第十四届蓝桥杯青少组C++选拔赛[2022.12.18]第二部分编程题(5、猴子拿桃) - 详解

2025-09-20 22:19  tlnshuju  阅读(6)  评论(0)    收藏  举报

参考程序:

#include
using namespace std;
int main() {
int N, K;
cin >> N >> K;
vector a(N);
for (int i = 0; i > a[i];
const int NEG = -1000000000; // 当状态不可能时用这个很小的数表示
// dp[i][t] : 最后一次取的是第 i 筐(0-based),共取了 t 次时的最大和
vector> dp(N, vector(K + 1, NEG));
// 初始化:t = 1
for (int i = 0; i < N; ++i) dp[i][1] = a[i];
// 递推:t 从 2 到 K
for (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;
}