数字三角形模型

  • 前言
  • 最低通行费
  • 方格取数
  • 传纸条

前言

数字三角形题型的一般描述是:

给定一个共有N行的三角矩阵A,其中第t行有X列。从左上角出发,每次可以向下方或右下方走一步,最终到达底部求把经过的所有位置上的某种最优情况

一般这类题的dp表达式都是:f[i,j]f[i,j]f[i,j]

最低通行费

题目转送门

首先我们定义:f[i,j]f[i,j]f[i,j]表示,从(1,1)走到(i,j)的最小花费,我们先不考虑时间是(2n-1)内,对于一个(i,j)我们可以从四个方向进入它,因此有 f[i][j] = min(f[i][j] , f[xx][yy] + a[i][j]) ; 我们按照这个dp式子交上去发现也可以ac,这是因为对于一个(i,j)来说我们在dp的时候是不会选择走回头路到(i,j)的也就是从下方和右方进入。
那么结合时间,我们发现我们在不走回头路的情况下都要(2n - 1)的单位时间,因此我们在考虑时间后可以不用考虑四个方位了。

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 110 ;
int n ;
int a[N][N] , f[N][N];
int dx[4] = {1,-1,0,0} , dy[4] = {0,0,1,-1};int main(){cin>>n;memset(f , 0x3f , sizeof f);for(int i = 1 ; i <= n ; ++i)for(int j = 1 ; j <= n ; ++j)cin>>a[i][j];f[1][1] = a[1][1];for(int i = 1  ; i <= n ; ++i)for(int j = 1 ; j <= n ; ++j)for(int k = 0 ; k < 4 ; ++k){int xx = i + dx[k] , yy = j + dy[k];if(xx <= 0 && xx > n && yy <= 0 && yy > n)continue;f[i][j] = min(f[i][j] , f[xx][yy] + a[i][j]) ;}cout<<f[n][n]<<endl;return 0;
}

方格取数

题目转送门

这题由走一篇的最大值,变成看走两遍的最大值(且不能重复取)。最开始的思路是先走第一篇取得一个最大值,然后标记之后再走一篇,两者相加,但是这个题贪心的让两次都最大并不一定是最优解,
如果遇到两次能把所有点都踩到的情况:
但由于第一次和第二次没有联系,第一次只取最优解,可能会导致第二次不能把剩下的点都踩到。
因此二维无法满足我们,那么我们就扩大维数,变成:$f[k][i][j]f[k][i][j]f[k][i][j]
k=i1+j1=i2+j2k=i1+j1=i2+j2 : 两个小朋友同时走, 每个人走的步数和是一样的
我们考虑集合划分

// 需要判断j是否越界!
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 15;
int n ;
int a[N][N] , f[N*2][N][N];int main(){cin>>n;int x,y ,c;while(cin>>x>>y>>c , x || y ||c)a[x][y] = max(a[x][y],c);for(int k = 2 ; k <= n * 2 ; ++k)for(int i = 1 ; i <= n ; ++i)for(int j = 1 ;  j <= n ; ++j){int t = a[i][k-i] , &x = f[k][i][j] ;int j1 = k - i , j2 = k - j;if(j1 <= 0 || j1 > n || j2 <= 0 || j2 > n)continue;if(i != j ) t += a[j][k-j];x = max(x,f[k-1][i][j] + t);x = max(x,f[k-1][i][j-1] + t);x = max(x,f[k-1][i-1][j] + t);x = max(x,f[k-1][i-1][j-1] + t);}cout<< f[2*n][n][n] <<endl;return 0;
}

传纸条

题目转送门

题面分析:在这里我们可以转变一下思路,把求一条从(1,1) ->(n,m)和(n,m) - > (1,1)总共两条路径转化为,求两条从,(1,1) --> (n,m)的最大路径。那么这题就可以直接套用上一题的dp式子了。


要深刻理解dp表达式的含义

代码:

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 55;
int n , m ;
int w[N][N] , f[N<<1][N][N];int main(){cin>>n>>m;for(int i = 1 ; i <= n ; ++i)for(int j = 1 ; j <= m ; ++j)cin>>w[i][j];for(int k = 2 ; k <= n + m ; ++k)for(int i = 1; i <= n ; ++i)for(int j = 1 ; j <= n ; ++j){int t = w[i][k-i] + w[j][k-j] , &x = f[k][i][j];int j1 = k - i , j2 = k - j;if(j1 <= 0 || j1 > m || j2 <= 0 || j2 > m )continue;if(i != j || k == 2 || k == n + m){x = max(x,f[k-1][i][j] + t);x = max(x,f[k-1][i][j-1] + t);x = max(x,f[k-1][i-1][j] + t);x = max(x,f[k-1][i-1][j-1] + t);}}cout<<f[n+m][n][n]<<endl;return 0;
}

动态规划之数字三角形模型相关推荐

  1. 【动态规划专题】数字三角形模型

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

  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. Cisco ××× 完全配置指南-连载-IOS ×××阶段2连接详解
  2. MySQL:实用 SQL 语句集合
  3. bootstrap php zend,Zend Framework教程之Bootstrap类用法概述
  4. 动态添加后的数据转换 — 后台接收数据
  5. 电压压力蕊片_一文让你知道什么是压力变送器
  6. C语言 函数不定长参数 - C语言零基础入门教程
  7. 【常用表】三角函数基本公式
  8. 中首清算:她被誉为中国第一美女,迷倒国际花花公子,今36岁仍单身
  9. python中csv文件是什么_Python中的csv文件
  10. datedif函数(datedif函数在哪里找)
  11. 未能加载文件或程序集“Microsoft.Web.Infrastructure”
  12. elementUI动态菜单
  13. IDES安装之后的配置
  14. 神经网络预测结果都一样,神经网络预测结果分析
  15. asp毕业设计—— 基于asp+access的人事管理系统设计与实现(毕业论文+程序源码)——人事管理系统
  16. 加拿大存储厂商将在二战掩体中建设云数据中心
  17. 一起设计一个Android倒计时组件
  18. idea配置阿里代码规范
  19. 信道化接收机matlab,基于FPGA的数字信道化接收机研究与实现
  20. IE 在中国的春运刷票中又败了,Chrome扩展插件crx时代来临

热门文章

  1. java系统的标准输出对象_到了宋代,虽然司法证明已经发展到以物证为主,用刑讯方式逼问当事人口供在官府断案过程中却一直长期存在。...
  2. 怎么向后删除?(删除光标后的字符)(按delete键)
  3. IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boo
  4. 【大数据、数据挖掘、数据分析】用户画像是什么?如何制作用户画像?
  5. windows上不同版本的CUDA、cudnn是否能够共用?
  6. python opencv imread()函数 (从文件加载图像)
  7. python 文件操作 os.listdir() 遍历文件
  8. SpringBoot 使用WebMvcConfigurer处理请求
  9. SpringMVC学习(二)——快速搭建SpringMVC开发环境(注解方式)
  10. 带你读懂Spring Bean 的生命周期,嘿,就是玩儿~