这是迷宫类dp我自己取的名字,通常比较简单,上货

简单模型

数字三角形

状态表示:f[i][j]表示起点第\(i\)行第\(j\)个数最短路径的长度

状态转移:\(f[i][j] = max(f[i + 1][j], f[i + 1][j + 1]) + g[i][j]\) 即从左下点和右下点分别转移

代码

#include <iostream>
#include <cstring>
#include <algorithm> using namespace std; const int N = 1010;
typedef long long LL; int f[N][N]; int main()
{
int r;
cin >> r;
for(int i = 1; i <= r; i++)
for(int j = 1; j <= i; j++)
cin >> f[i][j]; for(int i = r; i >= 1; i --)
for(int j = 1; j <= i; j++)
f[i][j] = max(f[i + 1][j], f[i + 1][j + 1]) + f[i][j]; cout << f[1][1]; return 0;
}

基本模型

摘花生

状态表示:f[i][j]表示从起点走到(i, j)的最短路径的长度

状态转移:\(f[i][j] = max(f[i - 1][j] + g[i][j], f[i][j - 1] + g[i][j])\)

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#define INF 0x3f3f3f3f using namespace std; const int N = 110;
typedef long long LL; int f[N][N]; int main()
{
int T;
cin >> T;
while(T--)
{
int r, c;
cin >> r >> c;
for(int i = 1; i <= r; i ++)
for(int j= 1; j <= c; j ++)
cin >> f[i][j]; for(int i = 1; i <= r; i ++)
for(int j= 1; j <= c; j ++)
f[i][j] = max(f[i - 1][j] + f[i][j], f[i][j - 1] + f[i][j]); cout << f[r][c] << endl;
} return 0;
}

两次路径模型

方格取数

状态表示:f[i][j][k][p]表示第一个人走到(i,j),第二个人走到(k,l)的最优解

状态转移:$ f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1]);$

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#define INF 0x3f3f3f3f using namespace std; const int N = 11;
typedef long long LL; int g[N][N], f[N][N][N][N]; int main()
{
int n;
cin >> n;
int x, y;
while(cin >> x >> y >> g[x][y], x)
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
for(int k = 1; k <= n; k++)
{
for(int p = 1; p <= n; p++)
{
f[i][j][k][p] = max(f[i - 1][j][k - 1][p], f[i][j - 1][k - 1][p]);
f[i][j][k][p] = max(f[i][j][k][p], max(f[i - 1][j][k][p - 1], f[i][j - 1][k][p - 1]));
if(i == k && j == p)
{
f[i][j][k][p] += g[i][j];
}
else f[i][j][k][p] += g[i][j] + g[k][p];
}
} }
} cout << f[n][n][n][n] << endl;
return 0;
}

题面

(防止OJ炸(虽然不太可能

数字三角形 Number Triangles

题目描述

观察下面的数字金字塔。

写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

在上面的样例中,从 \(7 \to 3 \to 8 \to 7 \to 5\) 的路径产生了最大

输入格式

第一个行一个正整数 \(r\) ,表示行的数目。

后面每行为这个数字金字塔特定行包含的整数。

输出格式

单独的一行,包含那个可能得到的最大的和。

提示

【数据范围】

对于 \(100\%\) 的数据,\(1\le r \le 1000\),所有输入在 \([0,100]\) 范围内。

摘花生

题目描述

Hello Kitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。Hello Kitty只能向东或向南走,不能向西或向北走。问Hello Kitty最多能够摘到多少颗花生。

输入

第一行是一个整数\(T\),代表一共有多少组数据。\((1≤T≤100)\)

接下来是T组数据。

每组数据的第一行是两个整数,分别代表花生苗的行数\(R\)和列数 \(C(1≤R,C≤100)\)

每组数据的接下来\(R\)行数据,从北向南依次描述每行花生苗的情况。每行数据有\(C\)个整数,按从西向东的顺序描述了该行每株花生苗上的花生数目\(M(0≤M≤1000)\)。

输出

对每组输入数据,输出一行,内容为Hello Kitty能摘到得最多的花生颗数。

方格取数

[NOIP2000 提高组]

题目描述

设有 \(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\) 条路径上取得的最大的和。

迷宫类dp整合的更多相关文章

  1. 动态规划——区间DP,计数类DP,数位统计DP

    本博客部分内容参考:<算法竞赛进阶指南> 一.区间DP 划重点: 以前所学过的线性DP一般从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态. 区间DP也属于线性DP的一种, ...

  2. SDOI2010代码拍卖会 (计数类DP)

    P2481 SDOI2010代码拍卖会 $ solution: $ 这道题调了好久好久,久到都要放弃了.洛谷的第五个点是真的强,简简单单一个1,调了快4个小时! 这道题第一眼怎么都是数位DP,奈何数据 ...

  3. CH5E26 扑克牌 (计数类DP)

    $ CH~5E26~\times ~ $ 扑克牌: (计数类DP) $ solution: $ 唉,计数类DP总是这么有套路,就是想不到. 这道题我们首先可以发现牌的花色没有价值,只需要知道每种牌有 ...

  4. $Poj1737\ Connected\ Graph$ 计数类$DP$

    AcWing Description 求$N$个节点的无向连通图有多少个,节点有标号,编号为$1~N$. $1<=N<=50$ Sol 在计数类$DP$中,通常要把一个问题划分成若干个子问 ...

  5. $CF559C\ Gerald\ and\ Fiant\ Chess$ 计数类$DP$

    AcWing Description 有个$H$行$W$列的棋盘,里面有$N$个黑色格子,求一个棋子由左上方格子走到右下方格子且不经过黑色格子的方案数. $1<=H,M<=1e5,1< ...

  6. 查看权限详情 将部门大类单据整合,将子类单据id去重合并

    /** * 查看权限详情 * @param id 部门id * @return */ @GetMapping("getListInfo") public R getDetail(S ...

  7. UVA 10531 Maze Statistics 迷宫统计 迷宫插头DP 四联通 概率

    题意: 有一个N*M的图,每个格子有独立概率p变成障碍物.你要从迷宫左上角走到迷宫右下角.求每个格子成为一个有解迷宫中的障碍物的概率.N <= 5,M <= 6 分析: 这真是一道好题,网 ...

  8. 字符串类dp的题目总结

    熟练掌握回文串吧,大致有dp或者模拟类的吧 ①dp+预处理,懂得如何枚举回文串(一) ②dp匹配类型的题目(二) ③dp+预处理 子串类型 (三) ④字符串的组合数(四) 一:划分成回文串 UVA11 ...

  9. 牛牛的DRB迷宫(DP、二进制编码器)

    牛牛的DRB迷宫I 链接:https://ac.nowcoder.com/acm/contest/3004/A来源:牛客网 题目描述 牛牛有一个n*m的迷宫,对于迷宫中的每个格子都为'R','D',' ...

随机推荐

  1. Barbican密钥管理器服务

    Barbican服务介绍 Key Manager 服务 (barbican) 提供机密数据的安全存储.配置和管理.这包括密钥材料,例如对称密钥.非对称密钥.证书和原始二进制数据. Barbican 是 ...

  2. 从 Notion 分片 Postgres 中吸取的教训(Notion 工程团队)

    https://www.notion.so/blog/sharding-postgres-at-notion 今年(2021)早些时候,我们对 Notion 进行了五分钟的定期维护. 虽然我们的声明指 ...

  3. linux fedora35 配置jdk,安装mysql,安装tomcat

    配置jdk18很简单,下载jdk,只需要.tar.gz结尾的文件就行,https://download.oracle.com/java/18/latest/jdk-18_linux-x64_bin.t ...

  4. docker使用详解

    一.docker简介 docker 是一个开源的应用容器引擎,docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化 ...

  5. arts-week12

    Algorithm 69. Sqrt(x) - LeetCode Review Cloudflare goes InterPlanetary - Introducing Cloudflare's IP ...

  6. df-查看磁盘目录空间大小

    查看磁盘分区挂载情况. 语法 df [option] 选项 -T 显示文件系统类型. -h 带单位显示. 示例 [root@localhost ~]# df -Th Filesystem Type S ...

  7. Dockerfile 使用 SSH

    如果在书写 Dockerfile 时,有些命令需要使用到 SSH 连接,比如从私有仓库下载文件等,那么我们应该怎么做呢? Dockerfile 使用 SSH Dockerfile 文件配置 为了使得 ...

  8. Win10 LTSC 2021 安装及相关bug解决

    Win10 LTSC 2021 安装及相关bug解决 目录 Win10 LTSC 2021 安装及相关bug解决 准备文件 系统安装 系统激活 修复CPU占用高和输入法显示bug 安装微软应用商店 推 ...

  9. 【爬虫+情感判定+Top10高频词+词云图】"王心凌"热门弹幕python舆情分析

    目录 一.背景介绍 二.代码讲解-爬虫部分 2.1 分析弹幕接口 2.2 讲解爬虫代码 三.代码讲解-情感分析部分 3.1 整体思路 3.2 情感分析打标 3.3 统计top10高频词 3.4 绘制词 ...

  10. 2021.05.05【NOIP提高B组】模拟 总结

    T1 给你一棵树,要求增加最少的边权是的从根到每一个叶子的长度相等 不能改变原有的最大长度 这是一个贪心:尽可能往深度小的边增加 先预处理出 \(mx_i\) 表示从 \(i\) 到叶子的最大长度 然 ...