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 ...
随机推荐
- CheckForIllegalCrossThreadCalls = false
多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,这时如果想要访问窗口的控件,发现无法对其控制. 这时可将窗口构造函数中的CheckForIllegalCrossThreadCalls设置为f ...
- entity framework学习
资源 Entity Framework技术导游系列开篇与热身
- 数据结构4——浅谈DancingLinks的思想及应用
在学习DancingLinks之前,我们先来回顾一下我们以前学过的回溯法. 我们学习基础的回溯法的时候,我们都是先判断是否达到解,然后继续搜索. 对于搜到的下一个点,将他标记为使用过( vis[i]= ...
- Cortex-M3启动深度解析
Cortex-Mx启动,备忘,以免将来忘记.中断向量表不用说,从重置中断开始吧 LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 这里一共就执行了两个函 ...
- 微信小程序之两个页面传值
需求:发送页面点击某一个元素之后,获取该元素的属性值,然后把这些属性值传到接收页面中. 思路:获取当前点击元素的索引,就能获取当前元素的值,然后通过跳转的 url 地址传递值 还是整个完整的例子吧: ...
- 【转载】IdentityServer4 使用OpenID Connect添加用户身份验证
使用IdentityServer4 实现OpenID Connect服务端,添加用户身份验证.客户端调用,实现授权. IdentityServer4 目前已更新至1.0 版,在之前的文章中有所介绍.I ...
- WebGL光照阴影映射
原文地址:WebGL光照阴影映射 经过前面的学习,webgl的基本功能都已经掌握了,我们不仅掌握了着色器的编写,图形的绘制,矩阵的变换,添加光照,还通过对webgl的基础api封装,编写出了便 ...
- Maven适配多种运行环境的打包方案
项目从开发到部署会历经多个运行环境,如开发环境.测试环境和生产环境,不同环境中项目的配置文件通常也会不同,典型的如数据库连接配置.我们当然不希望每次部署打包前都去修改配置文件以适配环境,利用Maven ...
- bzoj:4105: [Thu Summer Camp 2015]平方运算
Description Input 第一行有三个整数N,M,p,分别代表序列的长度.平方操作与询问操作的总次数以及在平方操作中所要模的数. 接下来一行N个数代表一开始的序列{X1,X2,... ...
- HDU-1013九余数定理
题目传送门:HDU1013 九余数定理 //题目描述:给定一个数,要求你求出它的每位上的数字之和,并且直到每位上的数字之和为个位时候输出它 //输入:一个整数 //输出:题目描述的结果 //算法分析: ...