P2045 方格取数加强版

题目描述

给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该格子的数就变成0,这样一共走K次,现在要求K次所达到的方格的数的和最大

输入输出格式

输入格式:

第一行两个数n,k(1<=n<=50, 0<=k<=10)

接下来n行,每行n个数,分别表示矩阵的每个格子的数

输出格式:

一个数,为最大和

输入输出样例

输入样例#1: 复制

3 1
1 2 3
0 2 1
1 4 2
输出样例#1: 复制

11

说明

每个格子中的数不超过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 方格取数加强版的更多相关文章

  1. 洛谷 P2045 方格取数加强版【费用流】

        题目链接:https://www.luogu.org/problemnew/show/P2045 题目描述 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现 ...

  2. P2045 方格取数加强版 最大费用最大流

    $ \color{#0066ff}{ 题目描述 }$ 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每 ...

  3. [洛谷P2045]方格取数加强版

    题目大意:有一个n*n的矩阵,每个格子有一个非负整数,规定一个人从(1,1)开始,只能往右或下走,走到(n,n)为止,并把沿途的数取走,取走后数变为0.这个人共取n次,求取得的数的最大总和. 解题思路 ...

  4. 洛谷 - P2045 - 方格取数加强版 - 费用流

    原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...

  5. bzoj P2045 方格取数加强版【最大费用最大流】

    今天脑子不太清醒,把数据范围看小了一直TTTTLE-- 最大费用最大流,每个格子拆成两个(x,y),(x,y)',(x,y)向(x,y)'连一条费用a[x][y]流量1的边表示选的一次,再连一条费用0 ...

  6. 洛谷P2045 方格取数加强版(费用流)

    题意 题目链接 Sol 这题能想到费用流就不难做了 从S向(1, 1)连费用为0,流量为K的边 从(n, n)向T连费用为0,流量为K的边 对于每个点我们可以拆点限流,同时为了保证每个点只被经过一次, ...

  7. 【Luogu】P2045方格取数加强版(最小费用最大流)

    题目链接 通过这题我学会了引诱算法的行为,就是你通过适当的状态设计,引诱算法按照你想要它做的去行动,进而达到解题的目的. 最小费用最大流,首先将点拆点,入点和出点连一条费用=-权值,容量=1的边,再连 ...

  8. 洛谷P2045 方格取数加强版 最小费用流

    Code: #include<cstdio> #include<cstring> #include<algorithm> #include<queue> ...

  9. [luogu_P2045]方格取数加强版

    [luogu_P2045]方格取数加强版 试题描述 给出一个 \(n \times n\) 的矩阵,每一格有一个非负整数 \(A_{i,j},(A_{i,j} \le 1000)\) 现在从 \((1 ...

随机推荐

  1. [Spark内核] 第31课:Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结

    本課主題 Master 资源调度的源码鉴赏 [引言部份:你希望读者看完这篇博客后有那些启发.学到什么样的知识点] 更新中...... 资源调度管理 任务调度与资源是通过 DAGScheduler.Ta ...

  2. Mac下jenkins用户权限配置错误,导致登录时提示:没有Overall/read权限

    由于初次接触jenkins,于是在搭建好jenkins以后,想要对用户进行管理,于是乎开始在系统管理->configure Global Security里设置用户的权限. 在启用安全-> ...

  3. "软件随想录" 读书笔记

    人员管理: 三种方法: 军事化管理方法, 经济利益驱动法, 认同法. 军事化管理方法不行. 经济利益驱动法也不行. 认同法, 其中一条建议是一起干活的人一起吃饭. 但这种做法比较困难. 设计的作用 寸 ...

  4. Java学习笔记12(面向对象五:构造方法、this再探)

    在开发中,经常需要在创建对象的同时明确对象对的属性值, 比如一个Person对象创建时候就应该有age和name等属性 那么如何做到在创建对象的同时给对象的属性初始化值呢? 这里介绍构造方法: 1.构 ...

  5. CSS(四)float 定位

    一.文档流 网页默认的定位方式 1.行级元素: 从左到右 2.块级元素: 从上到下 文档流的流动方式  从右下 到 左上 ↖ 二.浮动 1.浮动的定义 , 是元素脱离文档流  遇到父级边界 或相邻浮动 ...

  6. Vue2.0 相对于Vue1.0的变化:生命周期

    1.生命周期 根据提供的生命周期钩子说明Vue.js实例各个阶段的情况,Vue.js 2.0对不少钩子进行了修改,以下说明:(灰色字体代表是 2.0已经废弃或者被更名的钩子,黑色字体代表1.0 和2. ...

  7. python入门之函数

    为什么要用函数 python的函数是由一个新的语句编写,即def ,def是可执行的语句--函数并不存在,知道python运行了def后才存在. 函数是通过赋值函数传递的,参数通过赋值传递给函数. d ...

  8. from Require.js to Webpack(why)

    写在前面: 本文主要参考 From Require.js to Webpack - Part 1 (the reasons),原文作者将项目从 require.js 转移到了 webpack 并详细说 ...

  9. chrome使用技巧整理

    查看chrome的相关快捷键:打开chrome,按下F1,点击"键盘和鼠标快捷键". 1.查看版本: 浏览器输入网址:chrome://version/ 2.查看Chrome进程清 ...

  10. 第一个程序python.py

    print("hello word")print("hello hello")print("hello hello")print(" ...