洛谷 P1004 方格取数 题解
P1004 方格取数
题目描述
设有 \(N \times N\) 的方格图 \((N \le 9)\),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字\(0\)。如下图所示(见样例):
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
某人从图的左上角的\(A\)点出发,可以向下行走,也可以向右走,直到到达右下角的\(B\)点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字\(0\))。
此人从\(A\)点到\(B\)点共走两次,试找出\(2\)条这样的路径,使得取得的数之和为最大。
输入格式
输入的第一行为一个整数\(N\)(表示\(N \times N\)的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的\(0\)表示输入结束。
输出格式
只需输出一个整数,表示\(2\)条路径上取得的最大的和。
输入输出样例
输入 #1
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
输出 #1
67
说明/提示
NOIP 2000 提高组第四题
【思路】
多维dp
因为n的范围就是小于等于9
非常的小
所以完全可以考虑f(i,j,k,l) 表示状态
i,j表示第一次走到的位置
k,l表示第二次走到的位置
然后可以四重循环枚举
虽然不会爆复杂度
但是有一种很简单的方法可以少枚举一维
因为这两次走的步数都是一样的
所以第一次的步数等于i + j
那么只要知道k,就可以求出l
用i + j - k就可以求出
所以很容易就少枚举了一层循环
然后每个状态都有四种可能的情况
第一次是从左边移过来的,第二次是从上边移过来的
第一次是从左边移过来的,第二次是从左边移过来的
第一次是从上边移过来的,第二次是从上边移过来的’
第一次是从上边移过来的,第二次是从左边移过来的
然后比较这里免得最大值,
如果移动后的点位置相同,那就只加上这一个点的值
如果不同那就加上到达的两个点的值
【完整代码】
#include<iostream>
#include<cstdio>
using namespace std;
const int Max = 11;
int f[Max][Max][Max][Max];
int a[Max][Max];
int main()
{
int n;
cin >> n;
int x,y,z;
while(1)
{
cin >> x >> y >> z;
if(x == 0 && y == 0)
break;
a[x][y] = z;
}
for(int i = 1;i <= n;++ i)
{
for(int j = 1;j <= n;++ j)
{
for(int k = 1;k <= n;++ k)
{
int l = i + j - k;
if(l <= 0)
break;
f[i][j][k][l] = max(max(f[i - 1][j][k - 1][l],f[i - 1][j][k][l - 1]),max(f[i][j - 1][k - 1][l],f[i][j - 1][k][l - 1]));
if(i == k && j == l)
f[i][j][k][l] += a[i][j];
else
f[i][j][k][l] += a[i][j] + a[k][l];
}
}
}
cout << f[n][n][n][n] << endl;
return 0;
}
洛谷 P1004 方格取数 题解的更多相关文章
- 棋盘DP三连——洛谷 P1004 方格取数 &&洛谷 P1006 传纸条 &&Codevs 2853 方格游戏
P1004 方格取数 题目描述 设有N $\times N$N×N的方格图(N $\le 9$)(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字00.如下图所示(见样例): A ...
- 洛谷 P1004 方格取数 【多进程dp】
题目链接:https://www.luogu.org/problemnew/show/P1004 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 ...
- 洛谷P1004 方格取数
网络流大法吼 不想用DP的我选择了用网络流-- 建模方法: 从源点向(1,1)连一条容量为2(走两次),费用为0的边 从(n,n)向汇点连一条容量为2,费用为0的边 每个方格向右边和下边的方格连一条容 ...
- 【动态规划】洛谷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 ...
- 洛谷P1004 方格取数-四维DP
题目描述 设有 N \times NN×N 的方格图 (N \le 9)(N≤9) ,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 00 .如下图所示(见样例): A 0 0 0 0 0 ...
- Codevs 1043 ==洛谷 P1004 方格取数
题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 ...
- 洛谷 - P1004 - 方格取数 - 简单dp
https://www.luogu.org/problemnew/show/P1004 这道题分类到简单dp但是感觉一点都不简单……这种做两次的dp真的不是很懂怎么写.假如是贪心做两次,感觉又不能证明 ...
- 洛谷 P1004 方格取数 【多线程DP/四维DP/】
题目描述(https://www.luogu.org/problemnew/show/1004) 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0. ...
随机推荐
- .NET/C# 检测电脑上安装的 .NET Framework 的版本
原文:.NET/C# 检测电脑上安装的 .NET Framework 的版本 如果你希望知道某台计算机上安装了哪些版本的 .NET Framework,那么正好本文可以帮助你解决问题. 本文内容 如何 ...
- [unity]GPU Instance学习
前言我们之前研究过为什么Unity的UI可以合批,是因为使用了相同的材质进行渲染,UI上不同图片渲染是通过把图片打成一张图集后,使用Image组件对顶点填充了不同的UV值实现的.那么有没有什么办法可以 ...
- 【openshift】在Openshift上通过yaml部署应用
在Openshift上通过yaml部署应用 1.通过直接执行yaml 通过如下命令直接执行 oc create -f nginx.yml nginx.yml apiVersion: v1 items: ...
- cookie遇到java.lang.IllegalArgumentException: Control character in cookie value or attribute
java.lang.IllegalArgumentException: Control character in cookie value or attribute. 该异常说明cookie中的val ...
- Vivado Non-Project Flow
# ----------------------------------------------------------------------------- # Vivado Non-Project ...
- Linux在丢失的情况下重置密码
1.开机菜单是 移动光标到第一行 --敲击e 2.找到UTF-8,加上空格rd.break,敲击ctrl+x 3.输入以下命令 mount -o remount,rw /sysroot chroot ...
- UIP和lwip的区别 转载
uIP是专门为8位和16位控制器设计的一个非常小的TCP/IP栈.完全用C编写,因此可移植到各种不同的结构和操作系统上,一个编译过的栈可以在几KB ROM或几百字节RAM中运行.uIP中还包括一个HT ...
- qemu-kvm虚拟化——内存
dsqw
- nginx_status
server { listen ; server_name blog.oldboy.com; root /code/wordpress; index index.php index.html; loc ...
- 使用VS.NET2019做为C++开发专用IDE
一.下载安装包: https://visualstudio.microsoft.com/zh-hans/downloads/ 我下载的是企业版本. 二.安装支持C++ 序列号: Visual Stud ...