洛谷P1004 方格取数-四维DP
题目描述
设有 N \times NN×N 的方格图 (N \le 9)(N≤9) ,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 00 。如下图所示(见样例):
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
某人从图的左上角的 AA 点出发,可以向下行走,也可以向右走,直到到达右下角的 BB 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字 00 )。
此人从 AA 点到 BB 点共走两次,试找出 22 条这样的路径,使得取得的数之和为最大。
输入输出格式
输入格式:
输入的第一行为一个整数 NN (表示 N \times NN×N 的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的 00 表示输入结束。
输出格式:
只需输出一个整数,表示 22 条路径上取得的最大的和。
输入输出样例
说明
NOIP 2000 提高组第四题
思路:本题题意我就不解释了,一看这个题很像过河卒,过河卒是求路径数目,因此用一个递推求出,类似的本题也可以
我们用一个DP[i][j][k][z]表示第一个人走到map[i][j],第二个人走到map[k][z],此时走这种路径情况下的最大可获得最大取值
而DP[i][j][k][z]是由四个状态转移而来分别是DP[i-1][j][k-1][z],DP[i-1][j][k][z-1],DP[i][j-1][k-1][z],DP[i][j-1][k][z-1];
DP转移方程DP[i][j][k][z]=MAX(DP[i-1][j][k-1][z],DP[i-1][j][k][z-1],DP[i][j-1][k-1][z],DP[i][j-1][k][z-1])+maps[i][j]+maps[k][z];
还需要注意的是,(取走后的方格中将变为数字 0 )因此如果两者相遇就必须减掉一个maps[i][j]因为相遇的话肯定走的步数目相同,并且只有一个人拿到这个数字
因此减去maps[i][j]即可
当然还有什么SBFA,网络流的费用流做法等等非主流做法,以后更新
代码部分
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[][][][];
int maps[][];
int main(){
int n;
int x,y,z;
scanf("%d",&n);
while(){
scanf("%d%d%d",&x,&y,&z);
if (x==y && x==z && x==){
break;
}
maps[x][y]=z;
}
for (int i=;i<=n;i++){
for (int j=;j<=n;j++){
for (int k=;k<=n;k++){
for (int z=;z<=n;z++){
dp[i][j][k][z]=max(max(dp[i-][j][k-][z],dp[i-][j][k][z-]),max(dp[i][j-][k-][z],dp[i][j-][k][z-]))+maps[i][j]+maps[k][z];
if (i==k && j==z)dp[i][j][k][z]-=maps[i][j];
}
}
}
}
cout<<dp[n][n][n][n]<<endl; return ;
}
洛谷P1004 方格取数-四维DP的更多相关文章
- 洛谷 - P1004 - 方格取数 - 简单dp
https://www.luogu.org/problemnew/show/P1004 这道题分类到简单dp但是感觉一点都不简单……这种做两次的dp真的不是很懂怎么写.假如是贪心做两次,感觉又不能证明 ...
- 棋盘DP三连——洛谷 P1004 方格取数 &&洛谷 P1006 传纸条 &&Codevs 2853 方格游戏
P1004 方格取数 题目描述 设有N $\times N$N×N的方格图(N $\le 9$)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00.如下图所示(见样例): A ...
- 洛谷 P1004 方格取数 题解
P1004 方格取数 题目描述 设有 \(N \times N\) 的方格图 \((N \le 9)\),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字\(0\).如下图所示(见样例): ...
- 洛谷 P1004 方格取数 【多线程DP/四维DP/】
题目描述(https://www.luogu.org/problemnew/show/1004) 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0. ...
- 洛谷 P1004 方格取数 【多进程dp】
题目链接:https://www.luogu.org/problemnew/show/P1004 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 ...
- 洛谷P1004 方格取数
网络流大法吼 不想用DP的我选择了用网络流-- 建模方法: 从源点向(1,1)连一条容量为2(走两次),费用为0的边 从(n,n)向汇点连一条容量为2,费用为0的边 每个方格向右边和下边的方格连一条容 ...
- 四维动规 洛谷P1004方格取数
分析:这个题因为数据量非常小,可以直接用四维的DP数组 dp[i][j][k][l]表示第一个人走到位置(i,j),第二个人走到位置[k][l]时所取的数的最大和 状态转移方程可以轻松得出为:dp[i ...
- 洛谷 P1004 方格取数
题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...
- 【动态规划】洛谷P1004方格取数
题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...
随机推荐
- win10无法删除文件夹(其中的文件或者文件夹已在另一个程序中打开)怎么办?
1. 右键点击任务管理器 2.打开资源监视器 3.搜索任务,结束任务(可能会死机)
- Linux系统将http转为https
想把网站由http访问转变为https访问并没有想象中那么难,网上查了一些资料,想要转为https需要SSL安全证书,这里推荐一款景安网络的证书,可以免费试用一年时间,自己拿来实践还是很不错的选择. ...
- Reveal安装
一.安装 第一步:将Reveal.framework拖入工程中(下载地址:http://pan.baidu.com/s/1mgMJVDI,解压后产生的Reveal.framework,拖入工程即可). ...
- [ISE 14.7] _pn.exe 崩溃问题 点击浏览崩溃问题
前言 装了大半天的ISE 14.7 结果新建工程的时候只要点击浏览文件夹,直接无响应,其实和其他_pn.exe崩溃是一样的. 解决方法 第一步:非常重要,进行文件备份,将"F:\Xilinx ...
- swift class的虚函数表
class NSObjectBase: NSObject { func Msg_Normal(){ } func Msg_Second(){} func Msg_Third(){} @objc fun ...
- CSS3系列教程:HSL 和HSL
使用CSS3 HSL声明同样是用来设置颜色的.下一个呢? HSLA? 是的,这个和RGBA的效果是一样的. HSL声明使用色调Hue(H).饱和度Saturation(s)和亮度Lightness(L ...
- Python--Windows下安装虚拟环境
为什么需要虚拟环境 在python开发中,我们可能会遇到一种情况:就是当前的项目依赖的是某一个版本,但是另一个项目依赖的是另一个版本,这样就会造成依赖冲突.在这种情况之下,我们就需要一个工具能够将这两 ...
- 查询rman 备份信息集
SELECT TRIM(START_TIME||'#'), TRIM(END_TIME||'#'), TRIM(CASE OUTPUT_DEVICE_TYPE ...
- 关于Java并发编程的总结和思考
编写优质的并发代码是一件难度极高的事情.Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的,但是当我们对并发编程有了更深刻的认识和更多的实践后,实现并发编程就有了更多的方案和更 ...
- 市场不相信眼泪:AI第一股暴力裁员 惨了
近日,有网友在社交平台匿名爆料称,科大讯飞准备优化30%的正式员工. 还有人匿名爆料,科大讯飞无补助报销出差加班,迫使员工离职,并将矛头指向了一个叫“黄狗子”“黄国庆”的角色. 有媒体猜测,科大讯飞采 ...