社区讨论

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 条回复,欢迎继续交流。

正在加载回复...