专栏文章

P11248 [GESP202409 七级] 矩阵移动

算法·理论参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minpn3e4
此快照首次捕获于
2025/12/02 06:18
3 个月前
此快照最后确认于
2025/12/02 06:18
3 个月前
查看原文
把DP写在脸上的一道题
状态:dpi,j,kdp_{i,j,k}
表示位置为(i,j)(i,j)且还可以转换kk??时的最大得分
状态转移方程:
  1. (i,j)(i,j)是1时:dpi,j,k=max(dpi1,j,k,dpi,j1,k)+1dp_{i,j,k}=max(dp_{i-1,j,k},dp_{i,j-1,k})+1
  2. (i,j)(i,j)是0时:dpi,j,k=max(dpi1,j,k,dpi,j1,k)dp_{i,j,k}=max(dp_{i-1,j,k},dp_{i,j-1,k})
  3. (i,j)(i,j)是?时:dpi,j,k=max(dpi,j,k,max(dpi1,j,k1,dpi,j1,k1)+1)dp_{i,j,k}=max(dp_{i,j,k},max(dp_{i-1,j,k-1},dp_{i,j-1,k-1})+1) 前提是 k>0k>0
至于为什么会TLE,只能说这题卡常,太缺德了
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn(5e2+10);
int T,n,m,x;
int dp[maxn][maxn][maxn];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>T;
    while(T--){
        int maxx(0);
        cin>>n>>m>>x;
        memset(dp,0,sizeof(dp));
        for(int i(1);i<=n;++i){
            for(int j(1);j<=m;++j){
                char ch;
                cin>>ch;
                for(int k(0);k<=x;++k){
                    dp[i][j][k]=max(dp[i-1][j][k],dp[i][j-1][k])+(ch=='1');
                    if(k&&ch=='?'){
                        dp[i][j][k]=max(dp[i][j][k],max(dp[i-1][j][k-1],dp[i][j-1][k-1])+1);
                    }
                }
            }
        }
        for(int k(0);k<=x;++k){
            maxx=max(maxx,dp[n][m][k]);
        }
        // printf("%d\n",maxx);
        cout<<maxx<<'\n';
    }
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...