P2045 方格取数加强版
P2045 方格取数加强版
题目描述
给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成0,这样一共走K次,现在要求K次所达到的方格的数的和最大
输入输出格式
输入格式:
第一行两个数n,k(1<=n<=50, 0<=k<=10)
接下来n行,每行n个数,分别表示矩阵的每个格子的数
输出格式:
一个数,为最大和
输入输出样例
说明
每个格子中的数不超过1000
相信一定有一些人一看到N<=50就想搜索(233……),但是显然TLE。
那么对于K<=10,我记得当k<=2时,貌似用DP也能做。
这题的坑就在于“加强版”,其实这题是个图论。
再看看,不难想到这是网络流“最大流最大消费”,再看到aij<=1000,便可以将每个数取负数,就最小消费流即可。
怎么建图,是网络流中的难点。
因为每个点只能去一次,所以拆成两点,这两点之间有两条路,一条只能走一次(流量为1),但可以取到数(费用为-aij)
另一点最多能走k次,取不到数。
有人喜欢建超级源点和汇点(因为只取k次),其实不用如此。
我们从1,1点出发SPFAk次即可,注意如果有一次到不了终点直接结束!
OK,就这样AC了。注意点的位置,我用的是pos(i,j)=(i-1)*n+j,比较方便。
AC代码如下:
#include<cstdio> #include<cstring> #include<queue> #include<algorithm> #define pos(i,j) (i-1)*n+j using namespace std; +; *; struct p { int to,w,cost,nxt; }e[M]; ],dis[N<<],pre[N<<]; ]; int x,num,n,k,cnt; void add(int u,int v,int ds,int cst) { e[cnt].nxt=h[u]; e[cnt].to=v; e[cnt].w=ds; e[cnt].cost=cst; h[u]=cnt; cnt++; e[cnt].nxt=h[v]; e[cnt].to=u; e[cnt].w=; e[cnt].cost=-cst; h[v]=cnt; cnt++; } int solve() { ; while(k--) { memset(dis,0x3f,sizeof(dis)); memset(pre,-,sizeof(pre)); queue<int>q; q.push(); dis[]=; while(!q.empty()) { int now=q.front(); q.pop();inq[now]=; ;i=e[i].nxt) if(e[i].w&&dis[e[i].to]>dis[now]+e[i].cost) { dis[e[i].to]=dis[now]+e[i].cost; pre[e[i].to]=i; ; } } ) return -ans; ,j=n*n+N; ) { mx=min(mx,e[pre[j]].w); j=e[pre[j]^].to; } j=n*n+N; ) { ans+=e[pre[j]].cost*mx; e[pre[j]].w-=mx; e[pre[j]^].w+=mx; j=e[pre[j]^].to; } } return -ans; } int main() { memset(h,-,sizeof(h)); scanf("%d%d",&n,&k); ;i<=n;i++) ;j<=n;j++) { scanf("%d",&x); num=pos(i,j); add(num,num+N,,-x);add(num,num+N,k,); ,j),k,); ),k,); } printf("%d",solve()); ; }
P2045 方格取数加强版的更多相关文章
- 洛谷 P2045 方格取数加强版【费用流】
题目链接:https://www.luogu.org/problemnew/show/P2045 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现 ...
- P2045 方格取数加强版 最大费用最大流
$ \color{#0066ff}{ 题目描述 }$ 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每 ...
- [洛谷P2045]方格取数加强版
题目大意:有一个n*n的矩阵,每个格子有一个非负整数,规定一个人从(1,1)开始,只能往右或下走,走到(n,n)为止,并把沿途的数取走,取走后数变为0.这个人共取n次,求取得的数的最大总和. 解题思路 ...
- 洛谷 - P2045 - 方格取数加强版 - 费用流
原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...
- bzoj P2045 方格取数加强版【最大费用最大流】
今天脑子不太清醒,把数据范围看小了一直TTTTLE-- 最大费用最大流,每个格子拆成两个(x,y),(x,y)',(x,y)向(x,y)'连一条费用a[x][y]流量1的边表示选的一次,再连一条费用0 ...
- 洛谷P2045 方格取数加强版(费用流)
题意 题目链接 Sol 这题能想到费用流就不难做了 从S向(1, 1)连费用为0,流量为K的边 从(n, n)向T连费用为0,流量为K的边 对于每个点我们可以拆点限流,同时为了保证每个点只被经过一次, ...
- 【Luogu】P2045方格取数加强版(最小费用最大流)
题目链接 通过这题我学会了引诱算法的行为,就是你通过适当的状态设计,引诱算法按照你想要它做的去行动,进而达到解题的目的. 最小费用最大流,首先将点拆点,入点和出点连一条费用=-权值,容量=1的边,再连 ...
- 洛谷P2045 方格取数加强版 最小费用流
Code: #include<cstdio> #include<cstring> #include<algorithm> #include<queue> ...
- [luogu_P2045]方格取数加强版
[luogu_P2045]方格取数加强版 试题描述 给出一个 \(n \times n\) 的矩阵,每一格有一个非负整数 \(A_{i,j},(A_{i,j} \le 1000)\) 现在从 \((1 ...
随机推荐
- Fiddler中使用AutoResponder创建规则替换线上文件
Fiddler 的AutoResponder tab允许你从本地返回文件,而不用将http request 发送到服务器上. 1.AutoResponder规则实例 (1) 打开博客园首页,把博客园的 ...
- chrome console的使用 : 异常和错误的处理 – Break易站
本文内容来自:chrome console的使用 : 异常和错误的处理 – Break易站 利用 Chrome DevTools 提供的工具,您可以修复引发异常的网页和在 JavaScript 中调试 ...
- 漫话JavaScript与异步·第三话——Generator:化异步为同步
一.Promise并非完美 我在上一话中介绍了Promise,这种模式增强了事件订阅机制,很好地解决了控制反转带来的信任问题.硬编码回调执行顺序造成的"回调金字塔"问题,无疑大大提 ...
- Mongo查询关键字
- [原创]Nginx反向代理及负载均衡
1.基本命令 # 启动nginx start nginx.exe # windowsnginx -c /usr/local/nginx/conf/nginx.conf # Linux# 优雅的停止ng ...
- 使用Linq确定序列是否包含任何元素
假设我们有一个集合,想要判断这个集合中是否包含任何元素可以使用Linq中的Any() List<string> list = new List<string> { " ...
- 在地铁上看了zabbix 的书发现 "报警执行远程命令"
在地铁上看了zabbix 的书发现 "报警执行远程命令" 远程命令整个过程: items -> triggers -> action -> remote com ...
- [整理]k-vim-for-server通过vimrc修改vim格式
1.备份原来的vim设置: cp ~/.vimrc ~/.vimrc_bak 2. 下载配置到指定目录 法一: curl https://raw.githubusercontent.com/wklke ...
- [已解决]IndentationError: unindent does not match any outer indentation level
最近跟同事合作代码没有用git进行协同,很多代码拷贝后进行粘贴,常常报以上错误. 经过查询发现是空格跟tab混合使用了,重新将代码的缩进手动调整下就好了.
- Zabbix实战-简易教程--技巧一(操作类技巧)
一.常用操作技巧 1.克隆 监控项.模板.触发器都可以进行克隆.其中,模板克隆又分为克隆和完全克隆.完全克隆会将LLD也一起复制一份,就是和之前的模板一模一样,而模板的克隆只是克隆监控项,不复制低层次 ...