Kaka's Matrix Travels
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 9153   Accepted: 3696

Description

On an N × N chessboard with a non-negative number in each grid, Kaka starts his matrix travels with SUM = 0. For each travel, Kaka moves one rook from the left-upper grid to the right-bottom one, taking care that the rook moves only to the right or down. Kaka adds the number to SUM in each grid the rook visited, and replaces it with zero. It is not difficult to know the maximum SUM Kaka can obtain for his first travel. Now Kaka is wondering what is the maximum SUM he can obtain after his Kth travel. Note the SUM is accumulative during the K travels.

Input

The first line contains two integers N and K (1 ≤ N ≤ 50, 0 ≤ K ≤ 10) described above. The following N lines represents the matrix. You can assume the numbers in the matrix are no more than 1000.

Output

The maximum SUM Kaka can obtain after his Kth travel.

Sample Input

3 2
1 2 3
0 2 1
1 4 2

Sample Output


Source

POJ Monthly--2007.10.06, Huang, Jinsong
题意:
  1. 有个方阵,每个格子里都有一个非负数,从左上角走到右下角,每次走一步,只能往右或往下走,经过的数字拿走
  2. 每次都找可以拿到数字和最大的路径走,走k次,求最大和
  3. #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <vector>
    #include <queue>
    #include <map>
    #include <algorithm>
    #include <set>
    using namespace std;
    #define MM(a,b) memset(a,b,sizeof(a))
    typedef long long ll;
    typedef unsigned long long ULL;
    const int mod = 1000000007;
    const double eps = 1e-10;
    const int inf = 0x3f3f3f3f;
    const int big=50000;
    int max(int a,int b) {return a>b?a:b;};
    int min(int a,int b) {return a<b?a:b;};
    const int N = 70;
    const int M=10000+100;
    struct edge{
    int to,cap,cost,rev;
    }; vector<edge> G[5005];
    int mp[55][55], dist[5005],inq[5005],prev[5005],prel[5005];
    struct Point{
    int x,y;
    }; int n,k,m,x,y,c,cnth,cntm; void add_edge(int u,int v,int cap,int cost)
    {
    G[u].push_back(edge{v,cap,cost,G[v].size()});
    G[v].push_back(edge{u,0,-cost,G[u].size()-1});
    } int mincost(int s,int t,int f)
    {
    int ans=0;
    while(f>0)
    {
    memset(dist,inf,sizeof(dist));
    memset(inq,0,sizeof(inq));
    dist[s]=0;
    queue<int> q;
    q.push(s);
    inq[s]=1;
    MM(prev,-1);
    while(!q.empty())
    {
    int u=q.front();
    q.pop();inq[u]=0;
    for(int j=0;j<G[u].size();j++)
    {
    edge &e=G[u][j];
    if(e.cap>0&&dist[e.to]>dist[u]+e.cost)
    {
    dist[e.to]=dist[u]+e.cost;
    prev[e.to]=u;
    prel[e.to]=j;
    if(!inq[e.to])
    {
    q.push(e.to);
    inq[e.to]=1;
    }
    }
    }
    }
    for(int i=t;i>s;)
    {
    int f=prev[i];
    if(f==-1) return -1;
    int j=prel[i];
    G[f][j].cap-=1;
    G[i][G[f][j].rev].cap+=1;
    ans+=G[f][j].cost;
    i=prev[i];
    }
    f-=1;
    }
    return ans;
    } int in(int i,int j)
    {
    return (i-1)*2*n+j;
    } int out(int i,int j)
    {
    return (i-1)*2*n+n+j;
    } void build(int k)
    {
    add_edge(0,1,k,0); for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
    add_edge(in(i,j),out(i,j),1,-mp[i][j]);
    add_edge(in(i,j),out(i,j),k-1,0);
    } for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
    if(i!=n)
    add_edge(out(i,j),in(i+1,j),k,0);
    if(j!=n)
    add_edge(out(i,j),in(i,j+1),k,0);
    } add_edge(out(n,n),out(n,n)+1,k,0);
    } int main()
    {
    while(~scanf("%d %d",&n,&k))
    {
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    scanf("%d",&mp[i][j]);
    build(k);
    printf("%d\n",-mincost(0,out(n,n)+1,k));
    }
    return 0;
    }

      分析:1.建图时一个节点拆成两个,并且中间连接两条边,一条是费用该点的价值取反,另一条是为了保证这个节点能经过多次

  4. 2因为是最小费用流,所以需要将费用取反,跑完最小费用流后再取反就好

POJ 3422 矩阵取数 最小费用流拆点+负边的更多相关文章

  1. 51Nod 1084 矩阵取数问题 V2 —— 最小费用最大流 or 多线程DP

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1084 1084 矩阵取数问题 V2  基准时间限制:2 秒 空 ...

  2. NOIP2007 矩阵取数游戏

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  3. NOIP2007矩阵取数[DP|高精度]

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  4. TYVJ 矩阵取数 Label:高精度+dp

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  5. 【NOIP2007】矩阵取数

    因为傻逼写错高精度搞了一下午浪费好多时间,好想哭qaq 原题: 帅帅经常更同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij据为非负整数.游戏规则如下: 1. 每次取数时须从每 ...

  6. 51nod1084 矩阵取数问题 V2

    O(n4)->O(n3)妈呀为什么跑这么慢woc #include<cstdio> #include<cstring> #include<cctype> #i ...

  7. 1166 矩阵取数游戏[区间dp+高精度]

    1166 矩阵取数游戏 2007年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description [ ...

  8. 矩阵取数游戏 NOIP 2007

    2016-05-31 17:26:45 题目链接: NOIP 2007 矩阵取数游戏(Codevs) 题目大意: 给定一个矩阵,每次在每一行的行首或者行尾取一个数乘上2^次数,求取完最多获得的分数 解 ...

  9. 洛谷 P1005 矩阵取数游戏

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

随机推荐

  1. 微信小程序打开地图选择位置

    wx.getLocation({ type: 'wgs84', success(res) { const latitude = res.latitude const longitude = res.l ...

  2. 使用Python的文本挖掘的特征选择/提取

    在文本挖掘与文本分类的有关问题中,文本最初始的数据是将文档表示成向量空间模型的一个矩阵,而这个矩阵所拥有的就是不同的词,常采用特征选择方法.原因是文本的特征一般都是单词(term),具有语义信息,使用 ...

  3. Linux: cp 复制文件、文件夹到文件夹

    参数 a 该选项通常在拷贝目录时使用.它保留链接.文件属性,并递归地拷贝目录,其作用等于dpR选项的组合. d 拷贝时保留链接.    f 删除已经存在的目标文件而不提示.    i 和f选项相反,在 ...

  4. Constructing Tests CodeForces - 938C

    大意: 定义m-free矩阵: 所有$m*m$的子矩阵至少有一个$0$的$01$矩阵. 定义一个函数$f(n,m)=n*n$的m-free矩阵最大$1$的个数. 给出$t$个询问, 每个询问给出$x$ ...

  5. Tomcat 设置80端口

    1:修改tomcat配置 vi /usr/local/tomcat/conf/server.xml 找到 Connector port="8080" protocol=" ...

  6. python字典保存至json文件

    import os import json class SaveJson(object): def save_file(self, path, item): # 先将字典对象转化为可写入文本的字符串 ...

  7. O011、理解 virbr0

    参考https://www.cnblogs.com/CloudMan6/p/5308071.html   virbr0 是KVM 默认创建的一个Bridge ,其作用是为该宿主机上的虚机提供NAT上网 ...

  8. todo 看看堆栈里的东西

    类变量,成员变量,静态方法里的变量.参数,成员方法里的变量,参数

  9. Ubuntu - 14.04下,GO语言的安装!

    一,下载GO语言的安装文件,我直接下载GO语言的安装包(64位),并不是源码: 下载地址: 64位:https://storage.googleapis.com/golang/go1.6.linux- ...

  10. 数据库命令行工具USQL、mycli、litecli、pgcli

    USQL USQL 是一款使用 Go 语言开发的支持 SQL/NoSQL 数据库的通用命令行工具,它支持多种主流的数据库软件,目前最新版本是usql 0.7.0.比如 PostgreSQL.MySQL ...