题目描述


这是在阿尔托利亚·潘德拉贡成为英灵前的事情,她正要去拔出石中剑成为亚瑟王,在这之前她要去收集一些宝石。
宝石排列在一个n*m的网格中,每个网格中有一块价值为v(i,j)的宝石,阿尔托利亚·潘德拉贡可以选择自己的起点。
开始时刻为0秒。以下操作,每秒按顺序执行

  1. 在第i秒开始的时候,阿尔托利亚·潘德拉贡在方格(x,y)上,她可以拿走(x,y)中的宝石。
  2. 在偶数秒,阿尔托利亚·潘德拉贡周围四格的宝石会消失
  3. 若阿尔托利亚·潘德拉贡第i秒开始时在方格(x,y)上,则在第i+1秒可以立即移动到(x+1,y),(x,y+1),(x-1,y)或(x,y-1)上,也可以停留在(x,y)上。

求阿尔托利亚·潘德拉贡最多可以获得多少价值的宝石

输入格式

第一行给出数字N,M代表行列数.N,M均小于等于100,宝石的价值不会超过10000.下面N行M列用于描述数字矩阵

输出格式

输出最多可以拿到多少价值宝石

输入输出样例

输入 #1
2 2
1 2
2 1
输出 #1
4

说明/提示

姚金宇的原创题。

代码:

include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define R register
#define inf 1e9+7 using namespace std;
const int Excalibur = 10005;//N或MAXN
int n, m, S, T, cur[Excalibur], dep[Excalibur];
struct saber {//edge,我的王
int nxt, to, v;
}rin[Excalibur<<3];//是凛哦
int Lancer[Excalibur], Fate = 1, Archar;//emmm,head和tot以及sum
int x[5] = {0, -1, 0, 1, 0}, y[5] = {0, 0, -1, 0, 1}; inline void add(int from, int to, int v) {
rin[++Fate].v = v;
rin[Fate].to = to;
rin[Fate].nxt = Lancer[from];
Lancer[from] = Fate;
} inline bool bfs(int s, int t) {
queue<int> Rider;//q
for(R int i = 0;i <= T;++ i) cur[i] = Lancer[i], dep[i] = 0;
Rider.push(s); dep[s] = 1;
while(!Rider.empty()) {
R int vi = Rider.front();
Rider.pop();
for(R int i = Lancer[vi]; i ;i = rin[i].nxt) {
R int vc = rin[i].to;
if(!dep[vc] && rin[i].v) {
dep[vc] = dep[vi] + 1;
Rider.push(vc);
}
}
}
return dep[t];
} int dfs(int s, int t, int flow) {
if(!flow || s == t) return flow;
int Caster = 0, Assassin;//增量
for(R int i = cur[s]; i ;i = rin[i].nxt) {
R int vc = rin[i].to;
cur[s] = i;
if(dep[vc] == dep[s] + 1 && rin[i].v) {
Assassin = dfs(vc, t, min(flow, rin[i].v));
if(!Assassin) continue;
Caster += Assassin; flow -= Assassin;
rin[i].v -= Assassin; rin[i ^ 1].v += Assassin;
if(!flow) return Caster;
}
}
return Caster;
} int Dinic() {
int res = 0;
while(bfs(S, T)) res += dfs(S, T, inf);
return Archar - res;
} int main() {
scanf("%d%d",&n, &m);
//以下是建图,中二到此结束
S = 0, T = n * m + 1;
for(R int i = 1;i <= n;++ i)
for(R int j = 1;j <= m;++ j) {
R int v; scanf("%d",&v);
Archar += v;
R int p = (i - 1) * m + j;
if((i + j) & 1) { add(S, p, v);add(p, S, 0); }
else { add(p, T, v);add(T, p, 0); }
}
for(R int i = 1;i <= n;++ i) for(R int j = 1;j <= m;++ j)
if((i + j) & 1)
for(R int k = 1;k <= 4;++ k) {
R int f = i + x[k], g = j + y[k];
if(f < 1 || f > n || g < 1 || g > m) continue;
R int u = (i - 1) * m + j, v = (f - 1) * m + g;
add(u, v, inf); add(v, u, 0);
}
printf("%d",Dinic());
return 0;
}

最新文章

  1. php 导出对象生成代码并执行var_export和eval
  2. iOS中block的用法 以及和函数用法的区别
  3. JPA oneToMany 级联更新
  4. iOS - Swift NSNumber 数字
  5. /usr/bin/ld: cannot find -lz
  6. 利用 Composer 完善自己的 PHP 框架(一)——视图装载
  7. mysql修改主键
  8. 三星 note3销售地查询、销售地代码
  9. oracle 包,函数,过程,块的创建和执行及在java中执行(转)
  10. 【转】Python BeautifulSoup 中文乱码解决方法
  11. 【原创】JQWidgets-TreeGrid 1、快速入门
  12. linux(2)文件和目录管理(新增,删除,复制,移动,文件和目录权限,文件查找)
  13. Android MTK平台最完备的开机动画修改教程
  14. 【English】十四、英语
  15. 时间Date.js
  16. HTTP 及相关知识
  17. EntityFramework4.5使用Expression类创建动态查询及动态查询导航属性
  18. Atheros AR9285坑爹网卡仅仅有54M/65M,开启150M速率的方法
  19. 贪吃蛇Controller Java实现(二)
  20. Windows:chm 文件打开出现“已取消到该网页的导航”的解决方案

热门文章

  1. Stack Overflow是如何做应用缓存的
  2. .ajaxStart() / .ajaxStop() —— ajax请求开始时 / 结束时触发
  3. ajax中的事件
  4. 1-JavaScript变量
  5. Jerry带您了解Restful ABAP Programming模型系列之三:云端ABAP应用调试
  6. iveiw DatePicker 只能选择本月之前的日期,本月包括之后都不能选择
  7. PAT基础级-钻石段位样卷2-7-5 福到了 (15 分)
  8. java相关网址汇总1
  9. 使用python控制nginx禁封ip
  10. 如何使用Jmeter批量构造MySQL测试数据