洛谷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 ...
随机推荐
- banner图片全屏显示
<script> $(function () { function reinitSize() { var window_h = $(window).height(); var window ...
- Spring boot 直接访问templates中html文件
application.properties 在浏览器中输入http://localhost:8080/index.html 会报一个 因为Spring boot 无法直接访问templates下的文 ...
- jQuery-jqprint.js打印插件使用高版本jQuery时问题
使用jqprint打印插件的网页demo代码: <!doctype html> <html> <head> <meta charset="utf-8 ...
- 学生与部门管理app-产品功能与界面的简单设计
学生与部门管理app-产品功能与界面的简单设计 1. 结对成员学号 我:********* 大佬:*******10 2. 需求分析(NABCD模型) 2.1 N-需求 各个部门在开学初占据学校青春广 ...
- Markdown图片存储解决方法-利用阿里云OSS
我们在用markdown写一些博客或者文章的时候,常常需要引用一些图片,一般都是找一个免费的图床上传,然后复制图片链接在我们的markdown文章中.类似像这样: 存在的隐患 一般的免费图片托管网站有 ...
- Python3.6安装及引入Requests库
本博客可能没有那么规范,环境之类的配置.只是让你直接开始编程写python. 至于各种配置网络上有多种方法. 本文仅代表我的观点的一种方法. 电脑环境:win10 64位 第一步:下载python. ...
- Django urls 路由
写url和视图的的对应关系 from django.conf.urls import url from django.contrib import admin from app名 import vie ...
- [CQOI2014]排序机械臂
嘟嘟嘟 最近复习复习平衡树,然后又体会到了那种感觉:"写代码半小时,debug一下午". 这题其实就是让你搞一个数据结构,支持一下操作: 1.区间翻转. 2.查询区间最小值所在位置 ...
- 关于pyquery小知识点
#表示的是取html中的id元素, . 表示的是取html中的class元素. 如果是标签,就直接用标签名 而它们之间的空格,则表示嵌套关系 单冒号(:)用于CSS3伪类,双冒号(::)用于CSS3伪 ...
- VsCode语言设置为中文
一.安装插件 二.Ctrl+shift+p 搜索Configure Display Language 三.修改locale.json { // Defines VS Code's display la ...