luogu 1004 方格取数
题目描述
设有 $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 方格取数的更多相关文章
- 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 ...
- Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)
Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...
- 【luogu P1004 方格取数】 题解
题目链接:https://www.luogu.org/problemnew/show/P1004 标准的DP,不明白为什么有普及+提高的难度 四维DP[i][j][k][l] 表示第一遍走到i,j格子 ...
- LuoGu P1004 方格取数
题目传送门 一开始这个题我是不会的(沙华弱DP啊QwQ),后来考完试我一想,这东西怎么和数字三角形那题这么像啊? 都是自上而下,只能向下或者向右,求一个max 那么...这不就是个走两遍的数字矩阵嘛 ...
- luogu P2774 方格取数问题
有限制的问题,显然考虑全选再根据限制去掉的想法较优,我们发现一个点四周的点受限,其x或者y差一,也就是说奇偶性不同,那我们可以将其分成白点和黑点,就变成了最小割的问题,将每个白点向受限制的黑点连边,c ...
- P2774 方格取数问题 网络最大流 割
P2774 方格取数问题:https://www.luogu.org/problemnew/show/P2774 题意: 给定一个矩阵,取出不相邻的数字,使得数字的和最大. 思路: 可以把方格分成两个 ...
- HDU 1565&1569 方格取数系列(状压DP或者最大流)
方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- NOIP200003方格取数
NOIP200003方格取数 难度级别: D: 编程语言:不限:运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 XYZ 是首师大附中信息技术团编 ...
- vijos 1563 疯狂的方格取数
P1653疯狂的方格取数 Accepted 标签:天才的talent[显示标签] 背景 Due to the talent of talent123,当talent123做完NOIP考了两次的二取 ...
随机推荐
- 基于bind搭建DNS主从
使用bind的主从复制功能可以实现的功能:提供冗余,避免单点故障:均衡负载查询需求,从而提高系统可用性. 一.安装 #bind-chroot 负责DNS安全作用,将bind进程严格限制在特定的目录中 ...
- 发送html内容的email(转)
html中无法使用css, js.你发送一个<div>片断就好了,不用写整个html页面,因为即使写了,邮件客户端也会删除body之外(包括<body>这个标签)的内容,只留下 ...
- 在ios上时间无法parse返回 "Invalid Date"
百度搜索:" ios 上面 new date" 关键字 BUG 描述直接上原码 var psrseDate = Date.parse("2010-03-15 10:30: ...
- CentOS6.5安装RHadoop
1.首先安装依赖包(各个节点都要安装) [root@Hadoop-NN-01 ~]$ yum install gcc-gfortran #否则报”configure: error: No F77 co ...
- 使用Fiddler手机抓包https-----重要
Fiddler不仅可以对手机进行抓包,还可以抓取别的电脑的请求包,今天就想讲一讲使用Fiddler手机抓包! 使用Fiddler手机抓包有两个条件: 一:手机连的网络或WiFi必须和电脑(使用fidd ...
- background 背景图片 在IE8中不显示解决方法
我给ul加了一个背景图片 background 火狐 ie9 ch都显示.唯独在IE8中不显示 之前的样式代码 background: url( rgba(, , , ); 在ie8中改成 backg ...
- DevExpress使用技巧总结
DevExpress是非常主流的.NET控件,目前全世界和中国都用很多用户使用,不过由于是英文版,初次接触的同学可能会觉得困难,这里就总结DevExpress常见的10个使用技巧. 1.TextEdi ...
- 使用feof()判断文件结束时会多输出内容的原因
这是原来的代码: #include <stdio.h>int main(){ FILE * fp; int ch; fp = fopen("d:\\aaaaa\ ...
- 4:7 Struts实现Ajax
不使用插件: 返回数据: 使用插件: Action里面直接给User赋值,然后在前台拿值. type="json":表示返回json对象: root:表示作为跟对象 include ...
- 混合使用ForkJoin+Actor+Future实现一千万个不重复整数的排序(Scala示例)
目标 实现一千万个不重复整数的排序,可以一次性加载到 2G 的内存里. 本文适合于想要了解新语言 Scala 并发异步编程框架 Akka, Future 的筒鞋. 读完本文后,将了解如何综 ...