题目描述

设有 $N \times N$ 的方格图 $(N \le 9)$ ,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 $0$ 。如下图所示(见样例):

A
0 0 0 0 0 0 0 0
0 0 13 0 0 6 0 0
0 0 0 0 7 0 0 0
0 0 0 14 0 0 0 0
0 21 0 0 0 4 0 0
0 0 15 0 0 0 0 0
0 14 0 0 0 0 0 0
0 0 0 0 0 0 0 0
B

某人从图的左上角的 $A$ 点出发,可以向下行走,也可以向右走,直到到达右下角的 $B$ 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 $0$ )。
此人从 $A$ 点到 $B$ 点共走两次,试找出 $2$ 条这样的路径,使得取得的数之和为最大。

输入输出格式

**输入格式:**

输入的第一行为一个整数 $N$ (表示 $N \times N$ 的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的 $0$ 表示输入结束。

**输出格式:**
只需输出一个整数,表示 $2$ 条路径上取得的最大的和。
输入输出样例
> **输入样例#1:**
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
**输出样例#1:**
67

说明

NOIP 2000 提高组第四题

DP?不存在的

直接拆点建立两条边,值取反,跑最小费用最大流

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define maxn 100010
#define inf 0x3f3f3f3f
using namespace std;
int read()
{
int x=0,f=1;char s=getchar();
while('0'>s||s>'9') {if(s=='-') f=-1;s=getchar();}
while('0'<=s&&s<='9') {x=x*10+s-'0';s=getchar();}
return x*f;
}
int n,m,S,T;
int ans;
int map[10][10];
int from[maxn],dis[maxn],vis[maxn];
struct edge {
int u,v,nxt,spend,flow;
}e[maxn];
int head[maxn],tot=1;
void add_edge(int u,int v,int flow,int spend)
{
e[++tot].u=u;
e[tot].v=v;
e[tot].spend=spend;
e[tot].flow=flow;
e[tot].nxt=head[u];
head[u]=tot;
}
void add(int u,int v,int flow,int spend)
{
add_edge(u,v,flow,spend);
add_edge(v,u,0,-spend);
}
bool spfa()
{
memset(dis,inf,sizeof(dis));
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(S);
dis[S]=0;
while(!q.empty())
{
int x=q.front();
q.pop();
vis[x]=0;
for(int i=head[x];i;i=e[i].nxt)
{
int v=e[i].v;
int u=e[i].u;
int f=e[i].flow;
int s=e[i].spend;
if(dis[v]>dis[u]+s&&f)
{
dis[v]=dis[u]+s;
from[v]=i;
if(!vis[v])
{
q.push(v);
vis[v]=1;
}
}
}
}
return dis[T]!=inf;
}
int maxflow;
void work()
{
int mn=inf;
for(int i=T;i!=S;i=e[from[i]].u)
mn=min(mn,e[from[i]].flow);
for(int i=T;i!=S;i=e[from[i]].u)
{
e[from[i]].flow-=mn;
e[from[i]^1].flow+=mn;
ans+=e[from[i]].spend*mn;
}
maxflow+=mn;
}
int calc(int i,int j)
{
return n*(i-1)+j;
}
int main()
{
scanf("%d",&n);
int a,b,c;
while(233)
{
a=read();
b=read();
c=read();
if(!a) break;
map[a][b]=c;
}
S=0;T=200;
add(S,1,2,0);
add(n*n+100,T,inf,0);
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
int newx=i+1;
int newy=j+1;
if(newx>=1&&newx<=n)
{
add(calc(i,j)+100,calc(newx,j),inf,0);
//printf("a[%d][%d]->a[%d][%d] ",i,j,newx,j);
} if(newy>=1&&newy<=n)
{
add(calc(i,j)+100,calc(i,newy),inf,0);
//printf("a[%d][%d]->a[%d][%d]",i,j,i,newy);
}
}
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
add(calc(i,j),calc(i,j)+100,1,-map[i][j]);
add(calc(i,j),calc(i,j)+100,1,0);
}
}
while(spfa()) work(); printf("%d",-ans);
return 0;
}

luogu 1004 方格取数的更多相关文章

  1. luogu 1004 方格取数 dp

    题目链接 题意 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示: A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 ...

  2. Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)

    Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...

  3. 【luogu P1004 方格取数】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1004 标准的DP,不明白为什么有普及+提高的难度 四维DP[i][j][k][l] 表示第一遍走到i,j格子 ...

  4. LuoGu P1004 方格取数

    题目传送门 一开始这个题我是不会的(沙华弱DP啊QwQ),后来考完试我一想,这东西怎么和数字三角形那题这么像啊? 都是自上而下,只能向下或者向右,求一个max 那么...这不就是个走两遍的数字矩阵嘛 ...

  5. luogu P2774 方格取数问题

    有限制的问题,显然考虑全选再根据限制去掉的想法较优,我们发现一个点四周的点受限,其x或者y差一,也就是说奇偶性不同,那我们可以将其分成白点和黑点,就变成了最小割的问题,将每个白点向受限制的黑点连边,c ...

  6. P2774 方格取数问题 网络最大流 割

    P2774 方格取数问题:https://www.luogu.org/problemnew/show/P2774 题意: 给定一个矩阵,取出不相邻的数字,使得数字的和最大. 思路: 可以把方格分成两个 ...

  7. HDU 1565&1569 方格取数系列(状压DP或者最大流)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. NOIP200003方格取数

    NOIP200003方格取数 难度级别: D: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 XYZ 是首师大附中信息技术团编 ...

  9. vijos 1563 疯狂的方格取数

    P1653疯狂的方格取数 Accepted 标签:天才的talent[显示标签]   背景 Due to the talent of talent123,当talent123做完NOIP考了两次的二取 ...

随机推荐

  1. mysql 数据操作 多表查询 目录

    mysql 数据操作 多表查询 准备 多表连接查询介绍 mysql 数据操作 多表查询 多表连接查询 笛卡尔积 mysql 数据操作 多表查询 多表连接查询 内连接 mysql 数据操作 多表查询 多 ...

  2. 【Espruino】NO.07 获取电压值

    http://blog.csdn.net/qwert1213131/article/details/27985645 本文属于个人理解,能力有限,纰漏在所难免.还望指正! [小鱼有点电] 前几节的内容 ...

  3. java-信息安全(八)-迪菲-赫尔曼(DH)密钥交换【不推荐,推荐Oakley】

    概述 信息安全基本概念: DH(Diffie–Hellman key exchange,迪菲-赫尔曼密钥交换) DH 是一种安全协议,,一种确保共享KEY安全穿越不安全网络的方法,它是OAKLEY的一 ...

  4. spfa 判断负环 (转载)

    当然,对于Spfa判负环,实际上还有优化:就是把判断单个点的入队次数大于n改为:如果总的点入队次数大于所有点两倍 时有负环,或者单个点的入队次数大于sqrt(点数)有负环.这样时间复杂度就降了很多了. ...

  5. python3中pymysql模块安装及连接数据库(同‘python安装HTMLTestRunner’)

    https://pypi.org/project/PyMySQL/#files 安装完成之后就是连接数据库了 机器上安装了mysql的数据库,并且已经创建了两张表用于测试 python3连接数据库及删 ...

  6. nodejs加WebSocket,聊天工具

    1.WebSocket必须要与服务器连接,所以这里采用node起服务,这里用到了ws,,也有人用nodejs-websocket 2.首先 npm install ws 3.新建一个server.js ...

  7. 部署 Flask 应用时,为什么会需要 gunicorn 或 uWSGI?

    Flask自带的wsgi性能低下 只适合你开发调试的时候用, 线上你必须用Gunicorn+Nginx才能获得更强的性能,和更高的安全性

  8. myeclipse自定义JSP模板

  9. matlab 绘制条状图形

    clear,clc;A=zeros(1080,1920,3);A(:,1:384,:)=0;A(:,385:768,:)=10;A(:,769:1152,:)=20;A(:,1153:1536,:)= ...

  10. angular前端框架

    总所周知,在前端开发中,大家用的比较多的框架就是angular,vue,react等,今天就为大家讲一下angular大家框架的原理及运用 1.本次所举的例子是以依赖require.js的, < ...