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

题目:1015. 摘花生

思路

很经典的动态规划问题。

  1. 定义:v[i][j]表示位置是i,j的花生数量,f[i][j]表示走到位置i,j所能获得的最大花生数量。
  2. 初始状态:f[1][1],目标状态:f[n][m]
  3. 状态转移:由于题目规定只能向东或者向南走,所以说明当前情况只能由两种情况更新得到。
  • 由左边一个格子更新而来
  • 由上边一个格子更新而来
  1. 状态转移:由于我们是要取最大值,所以我们对两种情况取最大的那个即可。
  2. 边界问题:有多个方法处理边界问题。在下面的代码会具体体现。

代码

二维数组——边界处理Ⅰ

#include<iostream>

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int T;
	cin >> T;
	while (T--)
	{
		int n, m;
		cin >> n >> m;

		int v[110][110], f[110][110];
		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
				cin >> v[i][j];
		f[0][0] = v[0][0];
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				if (i == 0 and j == 0)
					continue;
				if (i == 0)
					f[i][j] = f[i][j - 1] + v[i][j];
				else if (j == 0)
					f[i][j] = f[i - 1][j] + v[i][j];
				else
					f[i][j] = max(f[i - 1][j], f[i][j - 1]) + v[i][j];

			}
		}
		cout << f[n - 1][m - 1] << endl;
	}
}

这里我们是从0开始读入的,所以边界处理起来就有点麻烦。在循环内部要进行特判。可能方便理解,但是代码写起来有些麻烦,不太推荐。


二维数组——边界处理Ⅱ

#include<iostream>
#include<cstring>

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int T;
	cin >> T;
	while (T--)
	{
		int n, m;
		cin >> n >> m;

		int v[110][110], f[110][110];
		memset(f,0,sizeof f);
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m; j++)
				cin >> v[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]) + v[i][j];
		cout << f[n][m] << endl;
	}
}

这里我们从1开始读入的,并且将f[][]初始状态置为0。这样当处理第一行或者第一列时,用到f[1][0]或者f[0][1]时,它们的值是0,不影响正常运算。


滚动数组

#include<iostream>
#include<cstring>

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int T;
	cin >> T;
	while (T--)
	{
		int n, m;
		cin >> n >> m;

		int v[2][110], f[2][110];
		memset(v, 0, sizeof v);
		memset(f,0,sizeof f);
		
		for(int i=1;i<=n;i++)
		{
			for (int j = 1; j <= m; j++)
			{
				cin >> v[i & 1][j];
				// cout<<v[i&1][j]<<" ";
				f[i & 1][j] = max(f[i & 1][j - 1], f[(i - 1) & 1][j]) + v[i & 1][j];
				// cout<<f[i&1][j]<<" ";
			}
// 			cout<<endl;
	    }
		cout << f[n & 1][m] << endl;
	}
}

记忆化搜索

#include<iostream>
#include<cstring>

using namespace std;
const int N=110,INF=0x3f3f3f3f;
int n, m;
int p[N][N],f[N][N];

int dp(int x,int y)
{
    // 如果大于等于0,说明这个点已经被搜索过
    if(f[x][y]>=0)
        return f[x][y];
        
    // 处理边界情况,由于是求最大值,所以我们赋值为负无穷
    if (x < 1 || x > n || y < 1 || y > m) return f[x][y] = -INF; 
    
    // 如果是起点
    if(x==1 and y==1)
        return f[x][y]=p[x][y];
        
    // 普通情况
    f[x][y]=max(f[x][y],dp(x-1,y)+p[x][y]);
    f[x][y]=max(f[x][y],dp(x,y-1)+p[x][y]);
    return f[x][y];
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int T;
	cin >> T;
	while (T--)
	{
		cin >> n >> m;
		
		// initial 全部置为-1,表示未被搜索
        memset(f, -1, sizeof f);
        
		for(int i=1;i<=n;i++)
		    for(int j=1;j<=m;j++)
		        cin>>p[i][j];
                
        dp(n,m);
        
        cout<<f[n][m]<<endl;
	}
	return 0;
}

同类题目练习

题目:1018. 最低通行费

代码

#include<iostream>
#include<cstring>

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int n;
	cin >> n;
	int v[110][110], f[110][110];
	memset(v, 0, sizeof v);

	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			cin >> v[i][j];

	f[1][1] = v[1][1];
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
		{
			if (i == 1 and j == 1)
				continue;
			if (i == 1)
				f[i][j] = f[i][j - 1] + v[i][j];
			else if (j == 1)
				f[i][j] = f[i - 1][j] + v[i][j];
			else
				f[i] [j] = min(f[i - 1][j], f[i][j - 1]) + v[i][j];
		}
	cout << f[n][n] << endl;
	return 0;
}

#include<iostream>
#include<cstring>

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);

	int n;
	cin >> n;
	int f[2][110], v[2][110];
	memset(v, 0, sizeof v);
	memset(f, 0x3f, sizeof f);

    cin>>v[1][1];
    f[1][1]=v[1][1];
	for(int i=1;i<=n;i++)
	{
		for (int j = 1; j <= n; j++)
		{
		   	if(i==1 and j==1)
			    continue;
			cin >> v[i & 1][j];
			f[i & 1][j] = min(f[i & 1][j - 1], f[(i - 1) & 1][j]) + v[i & 1][j];
		  //  cout<<f[i&1][j]<<" ";
		}
// 		cout<<endl;
    }

	cout << f[n & 1][n] << endl;
	return 0;
}


写在最后

如果你觉得我写题解还不错的,请各位王子公主移步到我的其他题解看看
数据结构与算法部分(还在更新中):
C++ STL总结 - 基于算法竞赛(强力推荐)
动态规划——01背包问题
动态规划——完全背包问题
动态规划——多重背包问题
动态规划——分组背包问题
最短路算法——Dijkstra(C++实现)
最短路算法———Bellman_Ford算法(C++实现)
最短路算法———SPFA算法(C++实现)
最小生成树算法———prim算法(C++实现)
最小生成树算法———Kruskal算法(C++实现)
染色法判断二分图(C++实现)
Linux部分(还在更新中):
Linux学习之初识Linux
Linux学习之命令行基础操作

✨🎉总结

“种一颗树最好的是十年前,其次就是现在”
所以,
“让我们一起努力吧,去奔赴更高更远的山海”
在这里插入图片描述
如果有错误❌,欢迎指正哟😋

🎉如果觉得收获满满,可以动动小手,点点赞👍,支持一下哟🎉

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024-03-24 需求分析-智能问答系统-调研

一. 需求列表 基于本地知识库的问答系统对接外围系统 数字人语音识别二. 待调研的公司 2.1 音视贝 AI智能外呼_大模型智能客服系统_大模型知识库系统_杭州音视贝 (yinshibei.com) 2.2 得助智能 智能AI客服机器人-智能电话机器人客服-电话电销机器人-得助智能 (51ima.com) 2…

Redis常见数据类型(1)

Redis提供了5种数据结构, 理解每种数据类型的特点对于Redis开发运维非常重要, 同时掌握每种数据类型的常见命令, 会在使用Redis的时候做到游刃有余. 内容如下: 预备知识: 几个全局命令, 数据结构和内部编码, 单线程机制解析. 5种数据类型的特点, 命令使用, 应用场景示例. 键遍历…

03-SparkSQL入门

0 Shark Spark 的一个组件&#xff0c;用于大规模数据分析的 SQL 查询引擎。Shark 提供了一种基于 SQL 的交互式查询方式&#xff0c;可以让用户轻松地对大规模数据集进行查询和分析。Shark 基于 Hive 项目&#xff0c;使用 Hive 的元数据存储和查询语法&#xff0c;并基于Hiv…

信号的小波包能量谱计算(以轴承振动信号为例,Python环境)

小波分析是近30年来发展起来的数学分支&#xff0c;是Fourier分析划时代发展的结果&#xff0c;由法国工程师Morlet首先提出&#xff0c;后广泛应用于信号处理、图像处理与分析、地震勘探、故障诊断、自动控制等领域&#xff0c;小波就是小的波形&#xff0c;所谓“小”是指它具…

备忘录导出的HTML文档转换MarkDown尝试记录

备忘录导出的HTML文档转换MarkDown尝试记录 1. pandoc命令行2. HTML转换MARKDOWN3. MD导入CSDN记录过长报错及压缩尝试参考 本地备忘录写了些旅游攻略&#xff0c;想做个纪念&#xff0c;导出为长图片ok&#xff0c;导出为HTML&#xff0c;也可以。但是导出图片是base64格式的&…

2、事件修饰符、双向绑定、style样式使用、v-for循环遍历、v-if 和 v-show

一、事件修饰符 1、.stop 阻止冒泡事件 给谁加了阻止冒泡事件&#xff0c;谁下面的盒子就不会执行了 <div id"app"><div class"parent" click"log3"><div class"child" click"log2"><button click.…

厨师上门服务小程序开发与运营指南

随着移动互联网的普及&#xff0c;各种生活服务类APP应运而生。厨师上门服务小程序作为一种新型的服务模式&#xff0c;为用户提供了便捷、个性化的餐饮服务。本文将为您介绍厨师上门服务小程序的开发与运营方法&#xff0c;帮助您快速搭建起一款实用的小程序。 一、小程序开发…

MyEclipse打开文件跳转到notepad打开问题

问题描述 windows系统打开README.md文件&#xff0c;每次都需要右键选择notepad打开&#xff0c;感觉很麻烦&#xff0c;然后就把README.md文件打开方式默认选择了notepad&#xff0c;这样每次双击就能打开&#xff0c;感觉很方便。 然后某天使用MyEclipse时&#xff0c;双击RE…

Linux系统——硬件命令

目录 一.网卡带宽 1.查看网卡速率——ethtool 网卡名 2.查看mac地址——ethtool -P 网卡名 二、内存相关 1.显示系统中内存使用情况——free -h 2.显示内存模块的详细信息——dmidecode -t memory 三、CPU相关 1.查看CPU架构信息——lscpu 2.性能模式 四、其他硬件命…

网络:DHCP 协议简介

文章目录 1. 前言2. DHCP 协议简介2.1 DHCP 客户端广播 DHCPDISCOVER 消息2.2 DHCP 服务器回复 DHCPOFFER 消息2.3 DHCP 客户端广播 DHCPREQUEST 消息2.4 DHCP 服务器回复 DHCPACK 消息2.5 剩余的工作 3. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&…

h5增强表单---数据列表和属性

h5增强表单---数据列表 下拉列表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</ti…

Echarts功能记录

基础配置 工具箱toolbox 对应功能 案例中使用到的第三方脚本

力扣450 删除二叉搜索树中的节点 Java版本

文章目录 题目描述思路代码 题目描述 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除…

学生如何帮老师撰写审稿意见

开头先介绍这篇文章做了什么&#xff0c;达到了什么样的目的、有什么创新点、应用&#xff0c;然后第一段最后一句写上&#xff0c;如果你进行了如下补充&#xff0c;明确表达了相关内容等&#xff0c;就能够接收你的文章&#xff08;在我们暂时不想接收他的文章的情况下&#…

JetPack之ViewModel

目录 一、简介1.1 优点1.2 生命周期 二、使用2.1 ViewModel保证数据稳定性demo2.2 ViewModel中如何传递上下文Context 三、注意点 一、简介 ViewModel 组件用于管理界面相关的数据&#xff0c;并且在配置更改&#xff08;如屏幕旋转&#xff09;时保持数据的一致性。ViewModel…

不可变集合及Stream流

若希望某个数据是不可修改的&#xff0c;就可以考虑使用不可变集合&#xff0c;以提高安全性&#xff1b;&#xff08;JKD9之后才有&#xff09; List不可变集合&#xff1a; public static void main(String[] args) {/*创建不可变的List集合"张三", "李四&q…

快速修复找不到msvcp140.dll,无法继续执行此代码问题

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“无法找到msvcp140.dll”的错误。那么&#xff0c;msvcp140.dll究竟是什么呢&#xff1f;它为什么会出现这样的错误呢&#xff1f;通过查阅资料和自己的实践经验&#xff0c;我对msvcp140.dll…

odoo 官方常用 widgets 小部件清单

在Odoo中&#xff0c;小部件&#xff08;Widgets&#xff09;是用于构建用户界面的组件&#xff0c;它们决定了表单、列表视图以及更多交互元素的显示和行为方式。虽然无法提供Odoo14及之后所有版本的确切小部件清单&#xff0c;但可以列举一些常见和重要的内置小部件类型&…

11.创建后台系统项目

后台系统项目 兼容性 vite官网&#xff1a;https://vitejs.dev/ vite中文网&#xff1a;https://cn.vitejs.dev/ vite需要node.js版本 >14.0.0&#xff0c;建议16 node -v 查看版本号 创建项目 进入存放目录 执行命令 npm create vitelatest 选择vue框架 选择typescript…

V R元宇宙平台的未来方向|V R主题馆加 盟|游戏体验馆

未来&#xff0c;VR元宇宙平台可能会呈现出以下发展趋势和可能性&#xff1a; 全面融合现实与虚拟世界&#xff1a; VR元宇宙平台将更加无缝地融合现实世界和虚拟世界&#xff0c;用户可以在虚拟环境中进行各种活动&#xff0c;与现实世界进行互动&#xff0c;并且体验到更加逼…