题解
2026-06-10 20:11:51
发布于:浙江
10阅读
0回复
0点赞
首发题解,庆祝一下
大家好,我是энтджей,今天是我2026年第十九次正式发题解!
能不能点个赞
首先简化题意:
- 你在你要到去,在上,当 时不得分; 时得一分; 你可以选择消耗一次机会(最多 次)将 变成 ,从而得一分,否则不得分。问到 时的最大得分
然后就是写代码:
-
处理输入(read):
- 正常输入
-
核心部分(process):
- 这是一道比较标准的,定义数组:
- 明显只能从 来,特别的,当 ,后面两个才成立
- 三重暴力循环,枚举 计算得出结果
最后输出(write):
- 输出结果
完整代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 510;
const int M = 310;
int T;
int n,m,x;
char a[N][N];
int dp[N][N][M];
void init() {
for(int k = 0; k <= x; k++){
for(int i = 0; i <= n; i++) {
for(int j = 0; j <= m; j++) {
dp[i][j][k] = 0;
}
}
}
}
void read() {
cin >> n >> m >> x;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
}
void process() {
init();
for(int k = 0; k <= x; k++){
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
dp[i][j][k] = (k > 0 && a[i][j] == '?') ? max(max(dp[i - 1][j][k], dp[i][j - 1][k]), max(dp[i - 1][j][k - 1], dp[i][j - 1][k - 1]) + 1) : max(dp[i - 1][j][k], dp[i][j - 1][k]) + ((a[i][j] == '1') ? 1 : 0);
}
}
}
}
void write() {
int ans = 0;
for(int k = 0; k <= x; k++) {
ans = max(ans, dp[n][m][k]);
}
cout << ans << endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> T;
while(T--){
read();
process();
write();
}
return 0;
}
🎉完结撒花🎉
这里空空如也






有帮助,赞一个