题目 算法
AcWing 1015. 摘花生 简单线性DP、数字三角形模型
AcWing 1018. 最低通行费 数字三角形模型
AcWing 1027. 方格取数 四维DP
AcWing 275. 传纸条 四维DP

闫氏DP分析法

从集合的角度思考DP问题

从最基础的例题开始分析

A、AcWing 1015. 摘花生

例题分析:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>using namespace std;const int N = 507, M = 500007, INF = 0x3f3f3f3f;int n,m,T;
int w[N][N];
int f[N][N];int main(){scanf("%d",&T);while(T -- ){memset(f,0,sizeof f);scanf("%d%d",&n,&m);for(int i = 1;i <= n;++i)for(int j = 1;j <= m;++j)scanf("%d",&w[i][j]);for(int i = 1;i <= n;++i)for(int j = 1;j <= m;++j)f[i][j] = max(f[i - 1][j],f[i][j - 1]) + w[i][j];// f[j] = max(f[j], f[j-1]) + a[i][j];cout<<f[n][m]<<endl;}return 0;
}

B、AcWing 1018. 最低通行费


因为是一个N* N的方格图,如果我们一直向右走然后再一直向下走,不走回头路地走到终点,我们就需要2(n−1)2(n - 1)2(n−1)的时间,所以本题和上一道摘花生是一道模板题。但是这里我们求的是最小值,所以我们在状态转移之前要把f数组初始化为INF。
还有需要注意的是由于求最小值取min,而第一行和第一列是不能从上一行和上一列转移过来的,但是上一行和上一列的f数组是0,会影响答案,所以需要特判一下。

#include<cstdio>
#include<algorithm>
#include<cstring>using namespace std;const int N = 110, INF = 0x3f3f3f3f;int n;
int w[N][N];
int f[N][N];int main(){scanf("%d",&n);for(int i = 1;i <= n;++i)for(int j = 1;j <= n;++j){scanf("%d",&w[i][j]);}for(int i = 1;i <= n;++i)for(int j = 1;j <= n;++j){if(i == 1 && j == 1)f[i][j] = w[i][j];else {f[i][j] = INF;if(i > 1)f[i][j] = min(f[i][j],f[i - 1][j] + w[i][j]);if(j > 1)f[i][j] = min(f[i][j],f[i][j - 1] + w[i][j]);}}printf("%d\n",f[n][n]);return 0;
}

C、AcWing 1027. 方格取数

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;const int N = 50, INF = 0x3f3f3f3f;
int n;
int e[N][N];
int f[N][N][N][N];int main(){int x,y,z;scanf("%d",&n);while(scanf("%d%d%d",&x,&y,&z) != EOF){e[x][y] = z;}for(int i = 1;i <= n;++i)for(int j = 1;j <= n;++j)for(int k = 1;k <= n;++k)for(int l = 1;l <= n;++l){f[i][j][k][l] = max(max(f[i - 1][j][k - 1][l],f[i][j - 1][k][l - 1]),max(f[i - 1][j][k][l - 1],f[i][j - 1][k - 1][l]));f[i][j][k][l] += e[i][j] + e[k][l];if(i == k && j == l)f[i][j][k][l] -= e[i][j];}cout<<f[n][n][n][n]<<endl;return 0;
}

D、AcWing 275. 传纸条

可以直接用上一题的代码( ̄▽ ̄)"

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;const int N = 51, INF = 0x3f3f3f3f;
int n,m;
int e[N][N];
int f[N][N][N][N];int main(){int x,y,z;scanf("%d%d",&n,&m);for(int i = 1;i <= n;++i)for(int j = 1;j <= m;++j){scanf("%d",&e[i][j]);}for(int i = 1;i <= n;++i)for(int j = 1;j <= m;++j)for(int k = 1;k <= n;++k)for(int l = 1;l <= m;++l){f[i][j][k][l] = max(max(f[i - 1][j][k - 1][l],f[i][j - 1][k][l - 1]),max(f[i - 1][j][k][l - 1],f[i][j - 1][k - 1][l]));f[i][j][k][l] += e[i][j] + e[k][l];if(i == k && j == l)f[i][j][k][l] -= e[i][j];}cout<<f[n][m][n][m]<<endl;return 0;
}

【动态规划专题】数字三角形模型相关推荐

  1. 动态规划之数字三角形模型

    数字三角形模型 前言 最低通行费 方格取数 传纸条 前言 数字三角形题型的一般描述是: 给定一个共有N行的三角矩阵A,其中第t行有X列.从左上角出发,每次可以向下方或右下方走一步,最终到达底部求把经过 ...

  2. [AcWing] 1018. 最低通行费(C++实现)数字三角形模型

    [AcWing] 1018. 最低通行费(C++实现)数字三角形模型 1. 题目 2. 读题(需要重点注意的东西) 3. 解法 4. 可能有帮助的前置习题 5. 所用到的数据结构与算法思想 6. 总结 ...

  3. 最长子序列和 动态规划python_算法基础之python实现动态规划中数字三角形和最长上升子序列问题...

    数字三角形问题:python 问题描述:函数 问题分析:spa 程序代码:(递归法和动归法)code # -*- coding: utf-8 -*- """ Create ...

  4. 动态规划初步--数字三角形

    数字三角形是一个由非负数组成的三角形,第n行有n个数,形如: 1 2 3 4  5 6 除最下行之外,每一行的左下和右下各有一个数,从第一行开始,向下,左或者右走一格,直到走到最后一行,所经过的路径上 ...

  5. 【动态规划】数字三角形2

    [题目描述] 数字三角形 要求走到最后mod 100最大 [输入格式] 第1行n,表示n行 <=25 第2到n+1行为每个的权值 [输出格式] mod 100最大值 [分析] 设置状态f[i][ ...

  6. 动态规划_数字三角形

    问题描述:在下面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大,路径上的每一步都只能往左下或右下走.只需要求出这个最大和即可,不必给出具体路径. 输入数据的要求:三角形的行数 ...

  7. 动态规划之数字三角形问题

    问题描述 在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或者右下走.只需要求出这个最大和即可.不必给出具体路径. 三角形的行数大于1小于等于100 ...

  8. 【动态规划】数字三角形c语言

    本学期的的算法实践课的实验作业.写的不好请大家多多指教. [题目] 试设计一个算法,计算出从三角形的顶到底的一条路径,使该路径经过的数字总和最大. 数据输入: 由文件input.txt提供输入数据.文 ...

  9. C++---数字三角形模型---最低通行费(每日一道算法2023.1.14)

    注意事项: 本题为线性dp-数字三角形的扩展题. 题目: 一个商人穿过一个 N×N 的正方形的网格,去参加一个非常重要的商务活动. 他要从网格的左上角进,右下角出. 每穿越中间 1 个小方格,都要花费 ...

最新文章

  1. 什么是深度智能:2021年深度智能的发展趋势
  2. PHP 高级编程之多线程
  3. 华为S5500T 存储巡检
  4. stm32中使用#pragma pack(非常有用的字节对齐用法说明)
  5. gva explaination
  6. ActiveMQ简介与安装
  7. MongoDB Project Fields
  8. C++并发编程之std::future
  9. Python str 与 bytes 类型(Python2/3 对 str 的处理)
  10. 计算机信息中心的安全生产责任,信息中心安全生产责任制 (刘.doc
  11. python3读取pdf文档;pdfminer3k
  12. win2008Server 部署网站
  13. 第三部分:成交动力学之十大成交激素——9、紧迫感
  14. 开源RapidScada插件开发---短信报警插件
  15. ios android 跨平台工具,15个很优秀的跨平台的移动开发工具
  16. 自制月球灯第一期之无线充电篇
  17. 基于51单片机的温湿度检测及调节系统
  18. 微信营销的技巧有哪些 微信营销取名的禁忌 微信内容写作的七个要点
  19. mysql创建单表只读访问用户及过程问题处理:如mysql: command not found ///GRANT command denied to user
  20. label设置自动换行的方法

热门文章

  1. Python 为什么用 # 号作注释符?
  2. 机器学习模型调参指南(附代码)
  3. 如何从0-1构建自己的”pytorch“(自己专属的深度学习框架)——part02
  4. 架构师升级之路,你掌握了吗?
  5. Java报表工具FineReport导出EXCEL的四种API
  6. 一年两次新产品发布,APICloud上线App定制服务平台
  7. FBI很气愤:黑了CIA的熊孩子又回来了
  8. javascript的typeof返回哪些数据类型
  9. RedHat9.0下载地址
  10. Java性能调优、LinkedIn容器部署、阿里移动性能调优——首届APMCon精彩演讲先睹为快...