社区讨论
90分,求条,比灌!!
P1544三倍经验参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mlxw83j6
- 此快照首次捕获于
- 2026/02/22 23:19 2 周前
- 此快照最后确认于
- 2026/02/24 23:15 2 周前
CPP
#include <bits/stdc++.h>
using namespace std;
long long n, k, arr[101][101], dp[101][101][121], v[101][101][101];
long long F(int x, int y, int p) {
if(x < 0 || y > n || y < 0 || x > n){//越界
return 0;
}
if(v[x][y][p]) return dp[x][y][p];
else {
if(p != k) { // 选择次数没有达到
dp[x][y][p] = max(dp[x][y][p], F(x + 1, y, p + 1) + arr[x + 1][y] * 3);
dp[x][y][p] = max(dp[x][y][p], F(x + 1, y + 1, p + 1) + arr[x + 1][y + 1] * 3);
} // 求得最大值这是
dp[x][y][p] = max(dp[x][y][p], F(x + 1, y, p) + arr[x + 1][y]); // 先找往下走的最小值
dp[x][y][p] = max(dp[x][y][p], F(x + 1, y + 1, p) + arr[x + 1][y + 1]); // 再找往右下方走的最小值
v[x][y][p] = 1;
return dp[x][y][p];
}
}
int main() {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cin >> arr[i][j]; // 输入地图
}
}
if(k > n) {
k = n; // 变成n个次数
}
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= i; j++) {
for (int q = 0; q <= k; q++) {
dp[i][j][q] = -1e11 - 1;
}
}
}
cout << max(F(1, 1, 0) + arr[1][1], F(1, 1, 1) + arr[1][1] * 3) << '\n';
return 0;
}
//💭
回复
共 1 条回复,欢迎继续交流。
正在加载回复...