《P11248 [GESP202409 七级] 矩阵移动》

题目背景

对应的选择、判断题:试题 - GESP 202409 C++ 七级 - 洛谷有题

题目描述

小杨有一个 n×m 的矩阵,仅包含 01? 三种字符。矩阵的行从上到下编号依次为 1,2,...,n,列从左到右编号依次为 1,2,...,m。小杨开始在矩阵的左上角 (1,1),小杨只能向下或者向右移动,最终到达右下角 (n,m) 时停止,在移动的过程中每经过一个字符 1 得分会增加一分(包括起点和终点),经过其它字符则分数不变。小杨的初始分数为 0 分。

小杨可以将矩阵中不超过 x 个字符 ? 变为字符 1。小杨在修改矩阵后,会以最优的策略从左上角移动到右下角。他想知道自己最多能获得多少分。

输入格式

第一行包含一个正整数 t,代表测试用例组数,接下来是 t 组测试用例。对于每组测试用例,一共 n+1 行。

第一行包含三个正整数 n,m,x,含义如题面所示。

之后 n 行,每行一个长度为 m 的仅含 01? 的字符串。

输出格式

对于每组测试用例,输出一行一个整数,代表最优策略下小杨的得分最多是多少。

输入输出样例

输入 #1复制

复制代码
2
3 3 1
000
111
01?
3 3 1
000
?0?
01?

输出 #1复制

复制代码
4
2

说明/提示

样例 1 解释

对于第二组测试用例,将 (2,1) 或者 (3,3) 变为 1 均是最优策略。

数据规模与约定

子任务编号 数据点占比 t n,m x
1 30% ≤5 ≤10 =1
2 30% ≤10 ≤500 ≤30
3 40% ≤10 ≤500 ≤300

对全部的测试数据,保证 1≤t≤10,1≤n,m≤500,1≤x≤300,保证所有测试用例 n×m 的总和不超过 2.5×105。

代码实现:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int INF = -1e9;
const int MAXX = 305;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;
    cin >> t;
    while(t--)
    {
        int n,m,x;
        cin >> n >> m >> x;
        vector<string> s(n+1);
        for(int i=1;i<=n;i++)
        {
            string tmp;
            cin >> tmp;
            s[i] = " " + tmp;
        }
        vector<vector<vector<int>>> dp(n+2, vector<vector<int>>(m+2, vector<int>(x+2, INF)));
        if(s[1][1] == '1')
        {
            dp[1][1][0] = 1;
        }
        else if(s[1][1] == '0')
        {
            dp[1][1][0] = 0;
        }
        else
        {
            dp[1][1][0] = 0;
            if(1 <= x) dp[1][1][1] = 1;
        }

        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(i == 1 && j == 1) continue;
                char c = s[i][j];
                for(int k=0;k<=x;k++)
                {
                    int up = INF, left = INF;
                    if(i>1) up = dp[i-1][j][k];
                    if(j>1) left = dp[i][j-1][k];
                    int pre = max(up, left);
                    if(pre == INF) continue;
                    if(c == '1')
                    {
                        dp[i][j][k] = max(dp[i][j][k], pre + 1);
                    }
                    else if(c == '0')
                    {
                        dp[i][j][k] = max(dp[i][j][k], pre);
                    }
                    else
                    {
                        dp[i][j][k] = max(dp[i][j][k], pre);
                        if(k+1 <= x)
                        {
                            dp[i][j][k+1] = max(dp[i][j][k+1], pre + 1);
                        }
                    }
                }
            }
        }
        int ans = 0;
        for(int k=0;k<=x;k++)
        {
            ans = max(ans, dp[n][m][k]);
        }
        cout << ans << '\n';
    }
    return 0;
}
相关推荐
Godspeed Zhao8 小时前
现代智能雷达技术14——算法(0)
线性代数·算法·雷达
梦帮科技17 小时前
推测解码(Speculative Decoding)与 Draft-Target 双核协同:接受率判据、树状验证与两倍吞吐无损加速
网络·人工智能·深度学习·神经网络·线性代数·矩阵·架构
Dylan的码园2 天前
求平均成绩 矩阵数据处理 【循环处理 二维数组】
c++·线性代数·矩阵
苏打豆2 天前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
梦帮科技3 天前
LoRA / QLoRA 低秩矩阵流形更新:SVD 分解、秩与缩放因子 α 的物理意义与梯度稳定性保障
网络·深度学习·神经网络·线性代数·矩阵·架构·数据挖掘
苏打豆3 天前
Pinocchio源码阅读——刚体运动物理量空间变换及求导
c++·线性代数·算法·矩阵·机器人
梦帮科技4 天前
量子张量网络破局大模型:从矩阵乘积态 (MPS) 到张量列 (TT-SVD) 低秩收缩全推导
网络·数据结构·数据库·线性代数·矩阵·架构·模拟退火算法
xailorliu4 天前
矩阵定性-正定负定不定半正定半负定
c++·opencv·线性代数·计算机视觉·矩阵
wzdark5 天前
矩阵快速幂算法在图路径计算中的应用4
线性代数·算法·矩阵
HIT_Weston7 天前
14、【数学】【线性代数】one-hot 与基向量:分类目标为什么能当概率分布
线性代数·数学