动态规划——数字三角形模型

news/2024/11/19 10:35:58/文章来源:https://www.cnblogs.com/gloria-wmh/p/18387559

数字三角形模型

母题 : 数字三角形

32c858b5886d86b8db6d2cc6d133f9f5

思路

​ 集合 f [i] [j] 表示所有从起点走到(i,j)的路径

​ 属性 f [i] [j] 存的数是集合中所有路径和的最大值

​ 状态计算:对于每一条从起点到 ( i , j ) 的路径,其要么是从左上方来的,要么是从右上方来的。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n;
int a[510][510];
int f[510][510];
signed main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=n;i++)for(int j=1;j<=i;j++) cin>>a[i][j];for(int i=0;i<=n;i++)for(int j=0;j<=i+1;j++) f[i][j]=-1e9;f[1][1]=a[1][1];for(int i=2;i<=n;i++)for(int j=1;j<=i;j++)f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];int mmax=-1e9;for(int i=1;i<=n;i++) mmax=max(mmax,f[n][i]);cout<<mmax<<endl; return 0;
}

子题1 : 摘花生

63eb5b0b75f3748d4d2178d4fd9eb7b6

思路

​ 基本和母题的思路一致,转移方程一致

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+10;
int f[N][N];
int w[N][N];
void solve()
{int n,m;cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)cin>>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];}cout<<f[n][m]<<endl;
}
signed main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int T=1;cin>>T;while(T--){solve();}return 0;
}

子题2 : 最低通行费

04e08eef2436637e0b47c3bcf7701441

思路

​ 因为必须在(2*N-1)个单位时间穿越过来,所以只能向右或向左移动

​ 集合 f [i] [j] 表示走到第i行第j列的所有方案

​ 属性 走过路线的总价值最小值Min

​ 转移方程

​ 从左面走过来 从右面走过来

​ f [i] [j] = f [i] [j-1] +w f [i] [j] = f [i-1] [j] +w

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+10;
const int inf = 1e9;
int w[N][N];
int f[N][N];
void solve()
{int n;cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)cin>>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]);}}}cout<<f[n][n]<<endl;
}
signed main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int T=1;// cin>>T;while(T--){solve();}return 0;
}

子题3 :方格取数

78ab8083b67d851befb40cbe03da79e1

思路

​ 和之前的题不同是本题需要走两边

​ 如果只走一次的话,求从起点到终点的最大权值和应该为:f[i] [j] = max(f[i-1] [j], f[i][j-1])+w[i] [j]; 即f[i][j]表示从起点走到(i,j)的最大权值和,

​ 而本题是从起点走两次走到终点的最大权值和,即状态表示为:f[i1] [j1] [i2] [j2];这里,我们考虑假设两条路线是同时走的,则表示为:所有从起点(1,1)(1,1)出发,然后分别走到(i1,j1),(i2,j2)的最大权值和

​ 我们可以进行 三维优化

​ 状态表示 f [k] [x1] [x2]

​ 集合 同时走K步,所有从(1,1),(1,1)走到 (x1,y1),(x2,y2) 获得花生的数目

​ 属性 Max

​ 状态计算 左 左 f [k-1] [x1-1] [x2-1]

​ 左 上 f [k-1] [x1-1] [x2]

​ 上 左 f [k-1] [x1] [x2-1]

​ 上 上 f [k-1] [x1] [x2]

特判 两个点是否重合 即 x1==x2 如果重合只加w [x1] [j1] 如果不重合加 w [x1] [j1] +w [x2] [j2]

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=15;
int w[N][N];
int f[N*2][N][N];
void solve()
{int n; cin>>n;int a,b,c;while(cin>>a>>b>>c,a||b||c) w[a][b]=c;for(int k=2;k<=n*2;k++){for(int i1=1;i1<=n;i1++){for(int i2=1;i2<=n;i2++){int j1=k-i1,j2=k-i2;if(j1>=1&&j1<=n&&j2>=1&&j2<=n){int t=w[i1][j1];if(i1!=i2) t+=w[i2][j2];int &x=f[k][i1][i2];x=max(x,f[k-1][i1-1][i2-1]+t);x=max(x,f[k-1][i1-1][i2]+t);x=max(x,f[k-1][i1][i2-1]+t);x=max(x,f[k-1][i1][i2]+t);}}}}cout<<f[n*2][n][n];
}
signed main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int T=1;// cin>>T;while(T--){solve();}return 0;
}

子题4 : 传纸条

cbadeb0cc9f4ad2230f4b87f3e5e2ea8

思路

​ 可以思考成和方格取数 相同的代码逻辑,一个从上向下走,一个从下向上走,可以理解为两条路从上向下走,加上其限制条件

​ 状态表示 f [k] [x1] [x2]

​ 集合 同时走K步,所有从(1,1),(1,1)走到 (x1,y1),(x2,y2) 得到权值的最大值

​ 状态计算

​ 左 左 f [k-1] [x1-1] [x2-1]

​ 左 上 f [k-1] [x1-1] [x2]

​ 上 左 f [k-1] [x1] [x2-1]

​ 上 上 f [k-1] [x1] [x2]

注意 不能走到一个格子里 (和方格取数不同的地方) ,因为最优解一定不会相交,一定可以绕开这个点向其他地方走

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=55;
int w[N][N];
int f[N*2][N][N];       //表示两条路径分别到达(i,k-i),(j,k-j);
void solve()
{int n,m; 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<k;i++){for(int j=1;j<k;j++){int &v=f[k][i][j];int tmp=w[i][k-i];if(i!=j) tmp+=w[j][k-j];v=max(v,f[k-1][i-1][j]);v=max(v,f[k-1][i-1][j-1]);v=max(v,f[k-1][i][j-1]);v=max(v,f[k-1][i][j]);v+=tmp;}}}cout<<f[n+m][n][n];
}
signed main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int T=1;// cin>>T;while(T--){solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/789330.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

盘点一个Pycharm汉化过程中的一个坑

大家好,我是Python进阶者。 一、前言 前几天在Python最强白银交流群【生产队的驴都是不歇的】问了一个Python汉化的问题,问题如下:要把我弄疯了,汉化不成功,想重新安装,又不给出卸载选项,通过硬盘安装插件又提示异常。去插件文件夹删除所有插件文件,再重新安装pycharm,…

深度解析:OCR技术在企业HR管理中的应用

HR管理的挑战 企业的HR部门在处理员工入职、资料审核、信息录入存储管理等环节面临着大量重复性劳动力的问题。而HR部门通常人手有限,传统的人工录入方式不仅效率低下,而且容易出错。OCR技术的引入,极大地起到了降本增效地目的。应用的办公场景人脸比对技术 应用背景:在员工…

.NET 摄像头采集

本文主要介绍摄像头(相机)如何采集数据,用于类似摄像头本地显示软件,以及流媒体数据传输场景如传屏、视讯会议等。 摄像头采集有多种方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),网上一些文章以及github已经有很多介绍,这…

Python深度学习股价预测、量化交易策略:LSTM、GRU深度门控循环神经网络|附代码数据

全文链接:https://tecdat.cn/?p=37539 原文出处:拓端数据部落公众号 分析师:Shuo Zhang 本文以上证综指近 22 年的日交易数据为样本,构建深度门控循环神经网络模型,从股价预测和制定交易策略两方面入手,量化循环神经网络在股票预测以及交易策略中的效果,结合一个Pytho…

Windos NTP 服务设定

1、修改注册表2, 双击 打开 设为自动 应用 保存

【专题】中国游戏产业AIGC发展前景报告合集PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p=37535 原文出处:拓端数据部落公众号 近八成头部游戏企业在人工智能、数字孪生、引擎开发、云技术和XR等技术领域布局;有近六成头部游戏企业已构建AI生产管线、赋能虚拟内容生产或智能营销;此外,国内TOP50游戏厂商投资AI企业已超百次。阅读原…

自动化测试:Monkey工具实践应用~

在移动应用的自动化测试中,意外的用户操作和各种不可预见的场景往往是导致应用崩溃的主要原因。如何有效地模拟这些复杂场景,成为了测试工程师的一大挑战。而在这一过程中,Monkey工具凭借其随机化测试的独特优势,成为了许多团队的利器。 那么,Monkey工具究竟是如何帮助测试…

TCP/IP、UDP/IP协议

参考链接 1、OSI七层模型 (1)OSI含义“OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是国际标准化组织(ISO)提出的一个试图使各种计算机在世界范围内互连为网络的标准框架,简称OSI。”(2)OSI定义了网络互连的七层模型(物理…

HTTP与UDP/TCP区别

1、HTTPHTTP是应用层协议,TCP是传输层协议! 虽然HTTP本身是一个协议,但其最终还是基于TCP的。不过,目前,有人正在研究基于TCP+UDP混合的HTTP协议 HTTP协议是建立在请求/响应模型上的2、OSI七层模型3、TCP/IP五层模型

RSA加密

题目来源[BUUCTF]REVERSE——rsa 打开文件夹有两个文件打开 pub.key 文件复制到解密网站对应 RSA 密钥指数 E=65537,这一串模数可以转化为十进制后可以分离出 p、qp=285960468890451637935629440372639283459,q=304008741604601924494328155975272418463 所以已知 E、p、q,也就…

JMeter手机app录制

在移动应用的性能测试中,如何准确、全面地捕捉用户操作并生成可复用的测试脚本,始终是测试工程师面临的一大挑战。而JMeter,作为一款功能强大的开源性能测试工具,不仅在Web测试中表现优异,在手机App的录制方面同样拥有独到的优势。 那么,如何利用JMeter来进行手机App的录…