洛谷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 ...
随机推荐
- Ubuntu18.04 更换源
在虚拟机新建一个Ubuntu18.04.1-live-server-amd64当做服务器 在安装软件时报错: slave@slave:~$ sudo -s[sudo] password for sla ...
- 09LaTeX学习系列之---Latex 字体的设置
目录 目录: (一) 字体族的设置 1.说明: 2.源代码: 3.输出结果: (二) 字体系列的设置 1.源代码: 2.输出效果: (三) 字体形状的设置 1.源代码: 2.输出效果: (四) 字体大 ...
- 17秋 软件工程 第二次作业 sudoku
2017年秋季 软件工程 作业2:个人项目 sudoku Github Project Github Project at Wasdns/sudoku. PSP Table PSP2.1 Person ...
- 软件工程实践_Task2_sudoku
软工实践_Task2 标签(空格分隔): 软工实践 相关要求:第二次作业--个人项目实战 github:传送门 解题思路 先是一点杂谈. 首先,看完作业要求之后,心里先有个大概的框架. 语言:C++ ...
- transition: 0.2s all ease;
/* 全部样式 0.2秒 缓动*/ transition: 0.2s all ease;
- HBase——强一致性详解
Hbase是一个强一致性数据库,不是“最终一致性”数据库,官网给出的介绍: “Strongly consistent reads/writes: HBase is not an "event ...
- GUI_菜单练习
package com.mywindow.test; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; ...
- P1019 单词接龙
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一 ...
- Sql Server 数据库作业备份
DECLARE @fileName nvarchar(100) SET @fileName='C:\DataBase_Back\Base' + REPLACE(REPLACE(REPLACE(REPL ...
- LOOPS HDU - 3853 (概率dp):(希望通过该文章梳理自己的式子推导)
题意:就是让你从(1,1)走到(r, c)而且每走一格要花2的能量,有三种走法:1,停住.2,向下走一格.3,向右走一格.问在一个网格中所花的期望值. 首先:先把推导动态规划的基本步骤给出来. · 1 ...