Problem E. 矩阵游戏 (2023年ccpc河南省赛)
原题链接:
https://codeforces.com/gym/104354
题意:
有一个n*m的矩阵,只有三种字符:0,1和?。从[1,1]走到[n,m],每次只能向下走或者向下走。当走到1的时候得一分,走到0的时候不得分,走到?的时候可以将他变为1从而得到一分,或者不变,求所有从[1,1]走到[n,m]的路径的得分的最大值
思路:
f[i][j][k]表示走到[i,j]恰好有k个?变成1的方案数的最大得分
状态转移:
a[i][j]‘0’:f[i][j][k]=max(f[i-1][j][k],f[i][j-1][k])
a[i][j]‘1’:f[i][j][k]=max(f[i-1][j][k]+1,f[i][j-1][k]+1)
a[i][j]==‘?’:
改:f[i][j][k]=max(f[i-1][j][k-1]+1,f[i][j-1][k-1]+1)
不改:f[i][j][k]=max(f[i-1][j][k],f[i][j-1][k])
那么这样的空间复杂度是n* m * x,会mle
于是考虑将数组优化到二维:f[j][k]
1.将k从大到小枚举
在转移的时候,如果按正常枚举,就会出现重复的情况,这时候只需要将k从大到小进行枚举,就避免了重复
#include<bits/stdc++.h>
using namespace std;
int n,m,x;
int f[505][1005];
char a[505][505];
bool cheek(int x,int y){if(x>=1&&x<=n&&y>=1&&y<=m) return true;else return false;
}
void sove(){scanf("%d%d%d",&n,&m,&x);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];}}for(int j=0;j<=m;j++){for(int k=0;k<=x;k++){f[j][k]=-0x3f3f3f3f;}}if(a[1][1]=='1'){f[1][0]=1;}else if(a[1][1]=='0'){f[1][0]=0;}else{f[1][1]=1;f[1][0]=0;}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){for(int k=x;k>=0;k--){if(a[i][j]=='1'){if(cheek(i-1,j)){f[j][k]=max(f[j][k],f[j][k]+1);}if(cheek(i,j-1)){f[j][k]=max(f[j][k],f[j-1][k]+1);}}else if(a[i][j]=='0'){if(cheek(i,j-1)){f[j][k]=max(f[j][k],f[j-1][k]);} }else{if(cheek(i-1,j)){if(k-1>=0) f[j][k]=max(f[j][k],f[j][k-1]+1);}if(cheek(i,j-1)){f[j][k]=max(f[j-1][k],f[j][k]);if(k-1>=0)f[j][k]=max(f[j][k],f[j-1][k-1]+1);} }}}}int ans=0;for(int i=0;i<=x;i++){ans=max(ans,f[m][i]);}cout<<ans<<endl;
}
int main(){int t;scanf("%d",&t);while(t--){sove();}return 0;
}
2.滚动数组
在转移的时候只用到了i和i-1层,那么我们就将i这一维开两个,在转移的时候在两维之间相互转移就可以了
#include<bits/stdc++.h>
using namespace std;
int n,m,x;
int f[3][505][1005];
char a[505][505];
bool cheek(int x,int y){if(x>=1&&x<=n&&y>=1&&y<=m) return true;else return false;
}
void sove(){scanf("%d%d%d",&n,&m,&x);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];}}for(int i=0;i<3;i++){for(int j=0;j<=m;j++){for(int k=0;k<=x;k++){f[i][j][k]=-0x3f3f3f3f;}}
}if(a[1][1]=='1'){f[1][1][0]=1;}else if(a[1][1]=='0'){f[1][1][0]=0;}else{f[1][1][1]=1;f[1][1][0]=0;}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){for(int k=0;k<=x;k++){if(a[i][j]=='1'){if(cheek(i-1,j)){f[i&1][j][k]=max(f[i&1][j][k],f[i-1&1][j][k]+1);}if(cheek(i,j-1)){f[i&1][j][k]=max(f[i&1][j][k],f[i&1][j-1][k]+1);}}else if(a[i][j]=='0'){if(cheek(i-1,j)){f[i&1][j][k]=max(f[i&1][j][k],f[i-1&1][j][k]);}if(cheek(i,j-1)){f[i&1][j][k]=max(f[i&1][j][k],f[i&1][j-1][k]);} }else{if(cheek(i-1,j)){f[i&1][j][k]=max(f[i&1][j][k],f[i-1&1][j][k]);if(k-1>=0)f[i&1][j][k]=max(f[i&1][j][k],f[i-1&1][j][k-1]+1);}if(cheek(i,j-1)){f[i&1][j][k]=max(f[i&1][j][k],f[i&1][j-1][k]);if(k-1>=0)f[i&1][j][k]=max(f[i&1][j][k],f[i&1][j-1][k-1]+1);} }}}}int ans=0;for(int i=0;i<=x;i++){ans=max(ans,f[n&1][m][i]);} cout<<ans<<endl;
}
int main(){int t;scanf("%d",&t);while(t--){sove();}return 0;
}
相关文章:
Problem E. 矩阵游戏 (2023年ccpc河南省赛)
原题链接: https://codeforces.com/gym/104354 题意: 有一个n*m的矩阵,只有三种字符:0,1和?。从[1,1]走到[n,m],每次只能向下走或者向下走。当走到1的时候得一分,走到0的时候不得分,走到?的时候可以将他…...

数字孪生模型构建理论及应用
源自:计算机集成制造系统 作者:陶飞 张贺 戚庆林 徐 俊 孙铮 胡天亮 刘晓军 刘庭煜 关俊涛 陈畅宇 孟凡伟 张辰源 李志远 魏永利 朱铭浩 肖斌 摘 要 数字孪生作为实现数字化转型和促进智能化升级的重要使能途径,一直备受各…...
Vue面试题:30道含答案和代码示例的练习题
Vue中的双向数据绑定是怎么实现的? 双向数据绑定通过使用v-model指令实现。v-model指令会在表单元素上创建一个监听器,在用户输入时实时更新Vue实例的数据,并且在Vue实例数据变化时更新表单元素的值。 如何在Vue中定义一个方法?…...
2023-05-09 LeetCode每日一题(有效时间的数目)
2023-05-09每日一题 一、题目编号 2437. 有效时间的数目二、题目链接 点击跳转到题目位置 三、题目描述 给你一个长度为 5 的字符串 time ,表示一个电子时钟当前的时间,格式为 “hh:mm” 。最早 可能的时间是 “00:00” ,最晚 可能的时间…...

第三节课 Linux文件权限
目录 文件属性详解 权限修改 文件所有者与属组修改 文件默认权限修改 Linux是多人多任务的操作系统,因此可能常常会有多人使用一台机器, 为了考虑每个人的隐私、方便用户合作,每个文件都有三类用户,权限是基于这三类用户设定的…...
开发STC89C51系列单片机需要的单片机技术
端口操作:控制单片机的输入输出端口,与外界进行通信。中断优先级:当多个中断同时发生时,确定哪个中断优先级更高,优先响应。时钟模块:控制单片机的时钟,可以精确计时。PWM技术:实现模…...
分布式键值存储是什么?(分布式键值存储大值)
文章目录 什么是分布式键值存储?分布式键值存储“大值”指什么? 什么是分布式键值存储? 分布式键值存储是一种分布式数据存储系统,它将数据存储为键值对的形式,并将这些键值对分散在多个节点上。每个节点都可以独立地…...

多线程(线程同步和互斥+线程安全+条件变量)
线程互斥 线程互斥: 任何时刻,保证只有一个执行流进入临界区访问临界资源,通常对临界资源起到保护作用 相关概念 临界资源: 一次仅允许一个进程使用的共享资源临界区: 每个线程内部,访问临界资源的代码&am…...
Flutter学习——开发Flutter需要的技能
第二章 Flutter开发所需要掌握的知识 文章目录 第二章 Flutter开发所需要掌握的知识前言一、开发语言Dart语言Android/Ios知识 二、组件学习三、调试与性能优化总结 前言 上一章,介绍了Flutter的来源和平台支持及特点,这一章,来梳理一下学习…...

SPSS如何进行因子分析和主成分分析之案例实训?
文章目录 0.引言1.因子分析2.主成分分析 0.引言 因科研等多场景需要进行数据统计分析,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对因子分析和主成分分析进行阐述。 1.因…...
图标字体与HTML转义字符:网页设计中的两个关键概念
在网页设计中,图标字体和HTML转义字符是两个重要的概念。图标字体用于显示网页的图标,可以让用户更加直观地理解网页的内容。而HTML转义字符则用于在网页中插入特殊的字符,以保证网页的安全性和可读性。 一、图标字体 在网页中显示图标&#…...

Elasticsearch详解
文章目录 概览使用与ES交互索引创建索引查询索引删除文档创建修改文档局部修改文档查询文档删除全查询 整合SpringBootpom依赖application.ymlElasticsearchAutoConfigurationElasticsearchPropertiesElasticsearchConstantPersonSearchPageHelperPersonServiceBaseElasticsear…...
学习笔记(13)网络基础
目录 1,get与post的区别2,JSON解析2.1,JSON.stringify2.2,JSON.parse 3,cookie3.1,set方法3.2,cookie方法用于设置响应头, 4,http模块4.1,请求报文和响应报文…...
LeertCode 134 加油站
题目: 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组 …...
python文件操作的基本流程
引入 程序运行过程中产生的数据会保存到内存中,如果想要永久保存下来,就必须将数据存放在硬盘上,应用程序如果想要操作计算机的硬件就必须通过操作系统,文件就是操作系统提供给应用程序来操作硬盘的虚拟概念,应用程序…...

1. 两数之和
原题链接: 1. 两数之和 https://leetcode.cn/problems/two-sum/ 完成情况: ##1. n 2 n^2 n2复杂度 2.HashMap进行优化 3.空间换时间方法 即,构建一个 1 0 − 9 10^-9 10−9 到 1 0 9 10^9 109这个大的数组,然后把数填进去&…...
操作系统:06 进程通信
1 基本概念 进程间通信是指两个或多个进程之间交互数据的过程,因为进程之间是相互独立的,为了协同工作必须进行进程间交互数据 2 进程间通信的分类 2.1 简单的进程间通信: 信号(携带附加数据)、文件、命令行参数、环境变量表 2.2 传统的进…...

WRF模式
随着生态文明建设和“碳中和”战略的持续推进,我国及全球气候变化及应对是政府、科学界及商业界关注的焦点。气候是多个领域(生态、水资源、风资源及碳中和等问题)的主要驱动因素,合理认知气候变化有利于解释生态环境变化机理及过…...

2直接连接的网络与VLAN划分【实验】【计算机网络】
2直接连接的网络与VLAN划分【实验】【计算机网络】 前言推荐2直接连接的网络与VLAN划分2.1共享式以太网和交换式以太网实验目的实验内容及实验环境实验原理共享式以太网交换式以太网 实验过程搭建实验环境初始化序训练操作共享式以太网-操作交换式以太网查看共享式以太网冲突查…...
【Linux0.11代码分析】04 之 head.s 启动流程
【Linux0.11代码分析】04 之 head.s 启动流程 一、boot/head.s 系列文章如下: 系列文章汇总:《【Linux0.11代码分析】之 系列文章链接汇总(全)》 . 1.《【Linux0.11代码分析】01 之 代码目录分析》 2.《【Linux0.11代码分析】02 之…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...

如何做好一份技术文档?从规划到实践的完整指南
如何做好一份技术文档?从规划到实践的完整指南 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...