【C】动态规划 之 多维最大最小路径和

news2024/11/23 20:07:56

总结一下这类题型的思路:

每一步所求的最优解 = 上一步的最优解 + 这一步的情况

1.数字三角形

主要思路:

1.到达每一个位置的最大和等于前一步最大和加上这一位置的值,而前一步要么是从左上下来,要么是从右上下来,这样就将原问题分解了

2.记得初始化dp数组,不然里面元素初值是不确定的

//数字三角形
//给定一个三角形,每一个结点选择移动至左下或者右下,
//找出一条路径使路径上数字和最大
#include<stdio.h>

int max(int a, int b){
	if(a>b){
		return a;
	}
	else
		return b;
}

int main(){
	int n;
	scanf("%d",&n);//输入三角形行数
	int a[n+1][n+1],i,j;
	int dp[n+1][n+1];//记录动态变化 
	for(i=0;i<=n;i++){
		for(j=0;j<=n;j++){
			dp[i][j]=-1;
		}
	}
	for(i=1;i<=n;i++){
		for(j=1;j<=i;j++){
			scanf("%d",&a[i][j]);
		}
	} 
	dp[1][1]=a[1][1];
	for(i=2;i<=n;i++){
		for(j=1;j<=i;j++){
			dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i][j];
		}
	}
	int the_max=0;
	for(j=1;j<=n;j++){
		if(dp[n][j]>the_max){
			the_max=dp[n][j];
		} 
	}
	printf("%d",the_max);
	return 0;
}

2.最低通行费

//最低通行费
//N*N矩阵,左上角进,右下角出,不能斜对角通过,求最小和
#include<stdio.h>

int min(int a, int b){
	if(a>b)
		return b;
	else
		return a;
}

int main(){
	int N;//矩阵宽度 
	scanf("%d",&N);
	int a[N+1][N+1];
	int i,j;
	for(i=1;i<=N;i++){
		for(j=1;j<=N;j++){
			scanf("%d",&a[i][j]);
		}
	}
	int dp[N+1][N+1];//动态数组
	//初始化 ,求最小值,所以初始化尽可能大 
	for(i=0;i<=N;i++){
		for(j=0;j<=N;j++){
			dp[i][j]=10000000;
		}
	}
	//完善初始化(很重要的一步)
	//左上角元素
	dp[1][1]=a[1][1]; 
	//第一行只能从左边来
	for(j=2;j<=N;j++){
		dp[1][j]=dp[1][j-1]+a[1][j];
	}
	//第一列只能从上面来 
	for(i=2;i<=N;i++){
		dp[i][1]=dp[i-1][1]+a[i][1];
	}
	//必须在2N-1个时间过去,所以只能从左边或者上边过来
	for(i=2;i<=N;i++){
		for(j=2;j<=N;j++){
			dp[i][j]=min(dp[i][j-1],dp[i-1][j])+a[i][j];
		}
	} 
	printf("%d",dp[N][N]);
	return 0;
}

3.方格取数

主要思路:

1.两条路线一起走,每次记录到达两个点位置可取最大值,本来是用一个四维数组dp[i1][j1][i2][j2],但是我们发现每次只能往左或者往下走一步,说明每一步横纵坐标的和是相同的,就可以设一个k表示横纵坐标和,且i1+j1=k,i2+j2=k,用一个三维数组dp[k][i1][i2]替代四维,而可以降低时间复杂度(重要思维

2.每一个坐标处的最大值,都等于上一步的最大值加上这一步可以获得的值,而上一步k-1有四种可能,依次比较即可

注意点:

1.给dp定义和初始化时要注意,从0,0开始赋初值(不然会访问到无值的地址),并且第三维度的大小是N*2+1

2.三重循环里的判断语句防止下标越界

3.不用根据题目意思将遍历过的地方设置为0,因为不是一次性的过程,这里一步一步只能往右边或者下面走是不会出现重复的

4.要注意,当两条路线的两个点不是同一个点时才能相加,否则会重复相加

//方格取数
//某些放入数据,其他为0,两条路径,和最大,向下或向右走
/*输入 
8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
*/
//输出:67 
#include<stdio.h> 
int max(int a, int b){
	return a > b ? a : b ;
}
int main(){
	int N;//方格N*N
	scanf("%d",&N);
	int np[N+1][N+1];
	//初始化
	int i,j,k;
	for(i=1;i<=N;i++){
		for(j=1;j<=N;j++){
			np[i][j]=0;
		}
	} 
	//放入数据 
	int a,b,c;
	scanf("%d %d %d",&a,&b,&c);
	while(a!=0 || b!=0 || c!=0){
		np[a][b]=c;
		scanf("%d %d %d",&a,&b,&c);
	}
	//dp[k][i1][j1]
	//i1+j1=i2+j2=k
	int dp[N*2+1][N+1][N+1];
	//初始化dp,注意下标范围 
	for(i=0;i<=N*2;i++){
		for(j=0;j<=N;j++){
			for(k=0;k<=N;k++){
				dp[i][j][k]=0;
			}
		}
	} 
	dp[2][1][1]=np[1][1];//左上角
	int i1,i2;
	for(k=2;k<=N*2;k++){
		for(i1=1;i1<=N;i1++){
			for(i2=1;i2<=N;i2++){
				int j1=k-i1;
				int j2=k-i2;
				//防止下标越界 
				if(j1>=1 && j1<=N && j2>=1 && j2<=N){
					int t=np[i1][j1];
					if(i2!=i1) t+=np[i2][j2];//防止重复累加,一个地方只能过一次 
					//np[i1][j1]=np[i2][j2]=0; 
					//不能设为0,因为本来就是不会重复走的,如果设为0会影响其他位置的计算,导致所求值偏小 
					dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1-1][i2-1]+t);
					dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1][i2-1]+t);
					dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1-1][i2]+t);
					dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1][i2]+t);
				}
			}
		}
	}
	printf("%d",dp[N*2][N][N]);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何应对app应用程序或者网站常见的几种攻击类型

大家好&#xff0c;我是咕噜铁蛋&#xff01;今天&#xff0c;我想和大家聊聊一个我们日常生活中经常遇到的问题——如何应对app或者网站常见的几种攻击类型。随着互联网的普及&#xff0c;app和网站已经成为我们获取信息、交流互动的重要平台。然而&#xff0c;这些平台也时常…

障碍物识别技术赋能盲人独立出行:一场静默的科技革新

作为一名资深记者&#xff0c;我始终关注并报道那些科技如何助力特殊群体克服生活挑战的动人故事。近期&#xff0c;一款叫做蝙蝠避障的应用进入了我的视线&#xff0c;它搭载先进障碍物识别技术以其独特的优势&#xff0c;悄然为视障人士的独立出行带来了显著变革。 “障碍物识…

MXNet安装:专业指南与深度解析

一、引言 MXNet是一个高效且灵活的深度学习框架&#xff0c;它支持多种编程语言和平台&#xff0c;并提供了丰富的深度学习算法和工具。随着深度学习技术的广泛应用&#xff0c;MXNet因其出色的性能和易用性受到了越来越多开发者和研究人员的青睐。本文将详细介绍MXNet的安装过…

基于yolov9来训练人脸检测

YOLOv9是一个在目标检测领域内具有突破性进展的深度学习模型&#xff0c;尤其以其在实时性与准确性上的优秀表现而受到广泛关注。针对人脸检测这一特定任务&#xff0c;YOLOv9通过其架构创新和算法优化提供了强大的支持。 YOLOv9在继承了YOLO系列&#xff08;如YOLOv7、YOLOv8&…

【数据结构与算法】二分查找算法

目录 二分查找算法什么是二分查找算法整数二分法常用算法模板 二分查找算法例题例题一&#xff1a;分巧克力问题例题二&#xff1a;M次方根 二分查找算法 什么是二分查找算法 枚举查找即顺序查找*&#xff0c;实现原理是逐个比较数组 a[0:n-1] 中的元素&#xff0c;直到找到元…

NFT Insider #126:Azuki 创始人将探索使用 AnimeChain 向 NFT 所有者分配版税

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members &#xff08;https://twitter.com/WHALEMembers&#xff09;、BeepCrypto &#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜…

互联网轻量级框架整合之设计模式

反射技术 Java的反射技术能够通过配置类的全限定名、方法和参数完成对象的初始化&#xff0c;甚至反射某些方法&#xff0c;大大的增强了Java的可配置型&#xff0c;这也是Spring IoC的底层原理&#xff0c;Java的反射技术覆盖面很广&#xff0c;包括对象构建、反射方法、注解、…

【Linux杂货铺】文件系统

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 硬盘 &#x1f4c2; 物理结构 &#x1f4c2; 存储结构 &#x1f4c2; CHS定址法 &#x1f4c2; 操作系统对硬盘的管理和抽象 &#x1f4c1; 文件系统 &#x1f4c2; 分区 &#x1f4c2; 分组 &#x1f4c2; inode号 分配…

十分钟到底能不能讲明白ROS到底能做啥

总结 录完视频发现十分钟不能&#xff0c;总共花了20分钟。 提纲&#xff1a; 课程、竞赛、论文Linux、C、Python、Github和ROS关联性强平台-资格和ROS关联性弱速度-成绩路径规划-全局和局部全局-侧重路径长短-找一条最优&#xff08;短&#xff09;的路局部-侧重速度控制-用…

LeetCode-72. 编辑距离【字符串 动态规划】

LeetCode-72. 编辑距离【字符串 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;动规五部曲解题思路二&#xff1a;动态规划【版本二】解题思路三&#xff1a;0 题目描述&#xff1a; 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最…

【R语言从0到精通】-3-R统计分析(列联表、独立性检验、相关性检验、t检验)

上两次教程集中学习了R语言的基本知识&#xff0c;那么我们很多时候使用R语言是进行统计分析&#xff0c;因此对于生物信息学和统计科学来说&#xff0c;R语言提供了简单优雅的方式进行统计分析。教程参考《Rlearning》 3.1 描述性统计分析 3.1.1 载入数据集及summary函数 我…

安卓一键logo设计工具_V3.6.9.1 高级版

【分析】&#xff1a;LOGO设计软件&#xff0c;可以一键生成无版权的网站LOGO等等。 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x

看linux内核启动流程需要的arm汇编学习笔记(二)

文章目录 一、ldr1.地址偏移模式2.变基模式3.标签3.1 访问宏定义3.2 访问一个字符串3.3 访问一个data 二、ldp和stp1.双字节加载2.双字节存储3.双字节存储的后变基模式 三、位操作1. 移位2. 按位操作3. 位段插入4.位段提取5.零计数指令 四、跳转指令1. cmp比较两个数2. cmn负向…

redis怪谈

缓存穿透、击穿、雪崩 《缓存三兄弟》 穿透无中生有key&#xff0c;布隆过滤null隔离 缓存击穿过期key&#xff0c;锁与非期解难题 雪崩大量过期key&#xff0c;过期时间要随机 面试必考三 兄 弟&#xff0c;可用限流来保底 什么是缓存穿透 指查询一个一定不存在的数据&#x…

CRMEB多商户商城系统,不止B2B2C

CRMEB多商户商城系统&#xff0c;是将多个商家汇聚到一个平台上开店&#xff0c;就像常见的京东、淘宝等。这个平台上一般包含4种不同角色&#xff0c;即平台运营管理方、入驻商家、供应商、消费者。 因为平台角色的多元化&#xff0c;多商户商城系统也具有联营、自营、招商、…

事务,MySQL函数和索引详解

文章目录 事务简介提交方式手动提交事务 事务执行流程修改事务的默认提交方式 事务原理四大特性隔离级别 MySQL函数常见的日期函数判断函数case when字符串函数数字函数 MySQL性能(了解)索引概念分类MySQL索引语法数据结构(了解)BTreeBTree好处 优缺点优势劣势 创建原则 事务简…

echarts折线图自定义打点标记小工具

由于没研究明白echarts怎么用label和lableLine实现自定义打点标记&#xff0c;索性用markPoint把长方形压扁成线模拟了一番自定义打点标记&#xff0c;记录下来备用。&#xff08;markLine同理也能实现&#xff09; 实现代码如下&#xff1a; <!DOCTYPE html> <html…

【python】在pycharm用Django写一个API接口

背景 Django是一个高级的Python Web框架&#xff0c;它鼓励快速开发和干净、实用的设计。它由经验丰富的开发者设计&#xff0c;解决了Web开发的大部分麻烦&#xff0c;因此开发者可以专注于编写应用而不是重复造轮子。Django遵循MVC设计模式&#xff0c;并拥有自带的一套便捷…

「世界看两会」南非开普敦大学教授:中非之间的信任是宝贵资产

南非开普敦大学的卡洛斯洛佩斯教授在中国日报发表的文章中强调了中非之间所建立起的信任关系的重要性&#xff0c;视其为促进双方深化合作与互利共赢的关键性资产。他认为&#xff0c;中国两会是中国和非洲国家加强合作关系、规划共同发展战略的重要时机。 洛佩斯教授指出&…

内存地产风云录:malloc、free、calloc、realloc演绎动态内存世界的楼盘开发与交易大戏

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 在这个波澜壮阔的内存地产世界中&#xff0c;malloc、free、calloc和realloc四位主角&#xff0c;共同演绎着一场场精彩绝伦的楼盘开…