[ABC264F] Monochromatic Path
Problem Statement
We have a grid with $H$ rows and $W$ columns. Each square is painted either white or black.
For each integer pair $(i, j)$ such that $1 \leq i \leq H$ and $1 \leq j \leq W$,
the color of the square at the $i$-th row from the top and $j$-th column from the left (we simply denote this square by Square $(i, j)$) is represented by $A_{i, j}$.
Square $(i, j)$ is white if $A_{i, j} = 0$, and black if $A_{i, j} = 1$.
You may perform the following operations any number of (possibly $0$) times in any order:
- Choose an integer $i$ such that $1 \leq i \leq H$, pay $R_i$ yen (the currency in Japan), and invert the color of each square in the $i$-th row from the top in the grid. (White squares are painted black, and black squares are painted white.)
- Choose an integer $j$ such that $1 \leq j \leq W$, pay $C_j$ yen, and invert the color of each square in the $j$-th column from the left in the grid.
Print the minimum total cost to satisfy the following condition:
- There exists a path from Square $(1, 1)$ to Square $(H, W)$
that can be obtained by repeatedly moving down or to the right, such that all squares in the path (including Square $(1, 1)$ and Square $(H, W)$) have the same color.
We can prove that it is always possible to satisfy the condition in a finite number of operations under the Constraints of this problem.
Constraints
- $2 \leq H, W \leq 2000$
- $1 \leq R_i \leq 10^9$
- $1 \leq C_j \leq 10^9$
- $A_{i, j} \in \lbrace 0, 1\rbrace$
- All values in input are integers.
Input
Input is given from Standard Input in the following format:
$H$ $W$
$R_1$ $R_2$ $\ldots$ $R_H$
$C_1$ $C_2$ $\ldots$ $C_W$
$A_{1, 1}A_{1, 2}\ldots A_{1, W}$
$A_{2, 1}A_{2, 2}\ldots A_{2, W}$
$\vdots$
$A_{H, 1}A_{H, 2}\ldots A_{H, W}$
Output
Print the answer.
Sample Input 1
3 4
4 3 5
2 6 7 4
0100
1011
1010
Sample Output 1
9
We denote a white square by 0 and a black square by 1.
On the initial grid, you can pay $R_2 = 3$ yen to invert the color of each square in the $2$-nd row from the top to make the grid:
0100
0100
1010
Then, you can pay $C_2 = 6$ yen to invert the color of each square in the $2$-nd row from the left to make the grid:
0000
0000
1110
Now, there exists a path from Square $(1, 1)$ to Square $(3, 4)$ such that all squares in the path have the same color (such as the path $(1, 1) \rightarrow (2, 1) \rightarrow (2, 2) \rightarrow (2, 3) \rightarrow (2, 4) \rightarrow (3, 4)$).
The total cost paid is $3+6 = 9$ yen, which is the minimum possible.
Sample Input 2
15 20
29 27 79 27 30 4 93 89 44 88 70 75 96 3 78
39 97 12 53 62 32 38 84 49 93 53 26 13 25 2 76 32 42 34 18
01011100110000001111
10101111100010011000
11011000011010001010
00010100011111010100
11111001101010001011
01111001100101011100
10010000001110101110
01001011100100101000
11001000100101011000
01110000111011100101
00111110111110011111
10101111111011101101
11000011000111111001
00011101011110001101
01010000000001000000
Sample Output 2
125
思考如何走出这条路径。
如果我现在是往右走的,那么如果现在颜色不对,我可以把这一列给修改了。只要我不转成往下走,修改这一列是不会有影响别的格子的。往下走时同理。所以题目说了一定有解,而我们构造出了一个可行解。
但是我们还可以往右走时修改这一行,那么现在有两个影响因素。定义 \(dp_{i,j,k,l}\) 表示走到了点 \((i,j)\),原来方向为 \(k\), \(l\) 表示在这个方向上是否经过反转。
那么现在有可能把整个棋盘变成 \(0\) 或者 \(1\),这不妨分开考虑。观察这一位是否需要经过整行/整列反转,计算代价。同时看要不要转弯,转弯后是否经过反转。
注意一件事,走在 \((1,1)\) 时是可以决定行反转还是列反转的,都要试一下。
感觉写成记忆化搜索直接点
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2005;
int h,w,r[N],c[N],a[N][N];
LL dp[N][N][2][2],ans;//0表示下,1表示右
LL dfs(int x,int y,int i,int j)
{
if(dp[x][y][i][j]!=-1)
return dp[x][y][i][j];
LL ret=1e18;
if(i)
{
int c=a[x][y]^j? ::c[y]:0;
if(x==h&&y==w)
return c;
if(y<w)
ret=min(ret,dfs(x,y+1,i,j)+c);
if(x<h)
{
if(a[x][y]^j)
ret=min(ret,dfs(x+1,y,0,1)+c);
else
ret=min(ret,dfs(x+1,y,0,0));
}
}
else
{
int c=a[x][y]^j? r[x]:0;
if(x==h&&y==w)
return c;
if(x<h)
ret=min(ret,dfs(x+1,y,i,j)+c);
if(y<w)
{
if(a[x][y]^j)
ret=min(ret,dfs(x,y+1,1,1)+c);
else
ret=min(ret,dfs(x,y+1,1,0));
}
}
// printf("%d %d %d %d %lld\n",x,y,i,j,ret);
return dp[x][y][i][j]=ret;
}
int main()
{
scanf("%d%d",&h,&w);
for(int i=1;i<=h;i++)
scanf("%d",r+i);
for(int i=1;i<=w;i++)
scanf("%d",c+i);
for(int i=1;i<=h;i++)
{
char ch;
for(int j=1;j<=w;j++)
scanf(" %c",&ch),a[i][j]=ch-'0';
}
memset(dp,-1,sizeof(dp));
ans=min(min(dfs(1,1,0,0),dfs(1,1,1,0)),min(dfs(1,1,0,1)+c[1],dfs(1,1,1,1)+r[1]));
for(int i=1;i<=h;i++)
for(int j=1;j<=w;j++)
a[i][j]^=1;
memset(dp,-1,sizeof(dp));
ans=min(ans,min(min(dfs(1,1,0,0),dfs(1,1,1,0)),min(dfs(1,1,0,1)+c[1],dfs(1,1,1,1)+r[1])));
printf("%lld",ans);
}
[ABC264F] Monochromatic Path的更多相关文章
- NodeJs之Path
Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...
- 【原】实时渲染中常用的几种Rendering Path
[原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 —— polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...
- Node.js:path、url、querystring模块
Path模块 该模块提供了对文件或目录路径处理的方法,使用require('path')引用. 1.获取文件路径最后部分basename 使用basename(path[,ext])方法来获取路径的最 ...
- VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%
1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...
- Leetcode 笔记 113 - Path Sum II
题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...
- Leetcode 笔记 112 - Path Sum
题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...
- Thinking in Unity3D:渲染管线中的Rendering Path
关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的 ...
- node之path模块
node之path模块 原文链接 //引用该模块 var path = require("path"); 1.路径解析,得到规范化的路径格式 对window系统,目录分隔为'', ...
- Linux系统修改PATH环境变量方法
在Linux安装一些软件通常要添加路径环境变量PATH.PATH环境变量通俗的讲就是把程序的路径"备案"到系统中,这样执行这些程序时就不需要输入完整路径,直接在bash输入程序名就 ...
- 利用XML FOR PATH 合并分组信息
-- ================================================ -- Description:合并分组内容 -- Author:夏保华 -- Date:2009 ...
随机推荐
- 简单对比一下 C 与 Go 两种语言
以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/U6jIT837x5Yxe6Ev1aMDsA 使用一个简单的计数程序将 ...
- Hugging News #0821: Hugging Face 完成 2.35 亿美元 D 轮融资
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- Codeforces 1257D - Yet Another Monster Killing Problem
题意: 有\(n\)个怪物,每个怪物有攻击力\(a_i\)点:有\(m\)个英雄,每个英雄有攻击力\(p_i\)点,耐力\(s_{i}\)点. 怪物需要被依次杀死(按输入顺序). 每一天可以挑选一个英 ...
- Blazor前后端框架Known-V1.2.14
V1.2.14 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Git ...
- xmind文件数据解析重构成mindmap可识别数据
[需求背景] 测试平台开发中,需要引入前端mindmap模块,进行在线xmind实时解析并前端展示 [卡点难点] 选取什么库进行xmind解析 如何转换成mindmap可以识别的数据 [xmind解析 ...
- Linux下jdk配置
1.首先执行以下命令查看可安装的jdk版本: yum -y list java* 执行成功后可看到如下界面: 2.选择自己需要的jdk版本进行安装,比如这里安装1.8,执行以下命令: yum in ...
- 前端三件套系例之HTML——HTML文档结构、文档声明、主体结构标签、HEAD头部标签、meta元信息、Body内常用标签、6 其他了解
文章目录 HTML文档结构 1. 文档声明 2.主体结构标签 3.HEAD头部标签 4.meta元信息 5 Body内常用标签 5.1 基本标签(块级标签和内联标签) 5.2 div标签和span标签 ...
- Capture Data.dmg
苹果apple mac 系统检测 日常分析 软件 https://gigafiles.apple.com/#/download 现有文件可供下载. 备注 Capture Data 9.9.0 Th ...
- interface 接口相关【GO 基础】
〇.接口简介 接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节.也就是说,接口可以将一种或多种特征归纳到一起,其他不同的对象通过实现此接口,来表示可以 ...
- 2023江苏省领航杯(部分CRYPTO题目复现)
决赛 回文 1.题目信息 =QfzEDO4YDNlBzN4gzN0YGM1QzYyUGZ3QDZzgDM7V2Sn52bI52Q= 2.解题方法 base64解码,两种思路: 要么是去掉前面=号解码 ...