设有 N×N 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示:

某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。

在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。

此人从 A 点到 B 点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。

输入格式

第一行为一个整数N,表示 N×N 的方格图。

接下来的每行有三个整数,第一个为行号数,第二个为列号数,第三个为在该行、该列上所放的数。

行和列编号从 1 开始。

一行“0 0 0”表示结束。

输出格式

输出一个整数,表示两条路径上取得的最大的和。

数据范围

N≤10

输入样例:

8
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

输出样例:

67

分析:

/*
分开两次走(贪心):第一次走到(n, n)求出最大值并记录路径令路径上点收益为0后再走一次。
第一次走为局部最优并且也对第二次走造成了影响,第二次走是在第一次影响下所能走的局部最优,不具备“无后效性”,因此分开两次走并不是全局最优解把 f[i1][j1][i2][j2] 转化为 f[k][i1][i2]
其中 k==i1+j1==i2+j2
等价于 f[i1][k−i1][i2][k−i2]
这样在处理 两次走到相同点的时候,可以转化为
i1==i2 或者 j1==j2 判断其中之一即可
由f[i1][j1−1][i2][j2−1] 转化为f[k−1][i1][i2]
因为 k−1==i1+j1−1==i2+j2−1
同理可得
f[i1−1][j1][i2−1][j2]==f[k−1][i1−1][i2−1]
f[i1][j1−1][i2−1][j2]==f[k−1][i1][i2−1]
f[i1−1][j1][i2][j2−1]==f[k−1][i1−1][i2]
注意 k的范围 2−n+n,因为 刚开始的时候k==i1+j1==2
j1 和 j2 要判断范围 ,因为 他们是从 k转化过来的,不能超过地图的边界范围
判断 两次取同一个格子的时候 满足以下条件
k==k
i1==i2
因此 j1==k−i1==j2==k−i2,w[i1][j2]==w[i2][j2]
*/

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 11;
int w[N][N];
int f[N * 2][N][N];int n;
int main()
{cin >> n;int a, b, c;while (cin >> a >> b >> c && (a || b || c))w[a][b] = c;for (int k = 2; k <= 2 * n; k++){for (int i1 = 1; i1 <= n && i1 < k; i1++){for (int i2 = 1; i2 <= n && i2 < k; i2++){int j1 = k - i1;int j2 = k - i2;int t = w[i1][j1];if (i1 != i2)t += w[i2][j2];int &x = f[k][i1][i2];x = max(x, f[k - 1][i1 - 1][i2 - 1] + t);x = max(x, f[k - 1][i1 - 1][i2] + t);x = max(x, f[k - 1][i1][i2 - 1] + t);x = max(x, f[k - 1][i1][i2] + t);}}}cout << f[2 * n][n][n];return 0;
}

1027. 方格取数相关推荐

  1. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  2. 【网络流24题】I、 方格取数问题(二分图的最大独立集/最小割)

    I. 方格取数问题(二分图的最大独立集/最小割) [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图 ...

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

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

  4. hdu2167 方格取数 状态压缩dp

    题意:      方格取数,八个方向的限制. 思路:      八个方向的不能用最大流了,四个的可以,八个的不能抽象成二分图,所以目测只能用dp来跑,dp[i][j]表示的是第i行j状态的最优,具体看 ...

  5. hdu 1565 方格取数(1)(状态压缩dp)

    方格取数(1)                                                                 Time Limit: 10000/5000 MS (J ...

  6. [codevs 1907] 方格取数3

    [codevs 1907] 方格取数3 题解: 二分图染色.最大点权独立集. 因为要用到最大独立集的一些思路,故先写了一篇最大独立集的题解:http://blog.csdn.net/qq_211102 ...

  7. [codevs 1227] 方格取数2

    [codevs 1227] 方格取数 2 题解: 注:这是CODEVS的方格取数2,走k次的版本. 因为每个格子可以走无数次,但走过一次之后数字就变成了0,也就是只有一次可以加上格子里的数字.所以要拆 ...

  8. HDU-1569 方格取数(2) 最小割最大流

    题义很简单,还记得方格取数(1)的时候,使用状态压缩写的,这里由于行列数太大,因此无法进行压缩.所以要运用的最小割最大流的思想来解这道题. 大概是这样分析的,题义是要我们求在一个方格内取出N个点,使得 ...

  9. Luogu_2774 方格取数问题

    Luogu_2774 方格取数问题 二分图最小割 第一次做这种题,对于某些强烈暗示性的条件并没有理解到. 也就是每一立刻理解到是这个图是二分图. 为什么? 横纵坐标为奇数的只会和横纵坐标为偶数的相连. ...

最新文章

  1. 面对500篇GNN论文,心态差点儿崩了,幸好我有这本小书
  2. 根据WordCloud的API参数来自定义词云
  3. linux日志分析与痕迹清理
  4. docker-Consul的概述及consul集群环境的搭建
  5. Linux进程共享通信 -- mmap实现
  6. 三分钟理解Python函数式编程与闭包
  7. C#预处理器指令 用法
  8. 【推荐算法】点击率模型特征交叉方向的发展及CAN模型介绍
  9. 软件测试某公司面试题2014
  10. cdt规约报文用程序解析_程序员必备的学习笔记《TCP/IP详解(二)》
  11. 无法在Web服务器上启动调试。您不具备调试此应用程序的权限,此项目的URL位于Internet区域。...
  12. 给WP7初学者:《WP7 Dev Quick Start系列视频》
  13. 解决 django 中 mysql gone away 的问题
  14. 如何直观的长时间统计Android应用的动态内存消耗
  15. Makefile.am编写规则
  16. 【快速幂】a^b%p问题
  17. python抛出异常的关键字_浅谈python抛出异常、自定义异常, 传递异常
  18. 数据结构折半查找例题_查找-第9章-《数据结构题集》习题解析-严蔚敏吴伟民版...
  19. 知识分享 | IEC FMEA手册 附录A.1摘录
  20. 云信api_服务端API文档

热门文章

  1. 人体力学-动量与冲量
  2. python绘制太阳系_用OpenGL制作太阳系
  3. mac版PHPstudy集成环境
  4. 线程安全有序的SET,Map, List
  5. meta标签功能整理
  6. 卸载npm和安装npm
  7. 使用DOM操作内联样式
  8. ParameterDirection
  9. python字典遍历的几种方法
  10. 在Unity中写一个妥妥贴贴的ARPG移动系统(二)