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

这篇具有很好参考价值的文章主要介绍了【C】动态规划 之 多维最大最小路径和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

1.数字三角形

【C】动态规划 之 多维最大最小路径和,c语言,动态规划,算法,开发语言【C】动态规划 之 多维最大最小路径和,c语言,动态规划,算法,开发语言

主要思路:

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.最低通行费

【C】动态规划 之 多维最大最小路径和,c语言,动态规划,算法,开发语言

【C】动态规划 之 多维最大最小路径和,c语言,动态规划,算法,开发语言

//最低通行费
//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.方格取数

【C】动态规划 之 多维最大最小路径和,c语言,动态规划,算法,开发语言

主要思路:

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.要注意,当两条路线的两个点不是同一个点时才能相加,否则会重复相加文章来源地址https://www.toymoban.com/news/detail-859424.html

//方格取数
//某些放入数据,其他为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;
}

到了这里,关于【C】动态规划 之 多维最大最小路径和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法刷刷刷|动态规划篇|509.斐波那契数| 70.爬楼梯| 746.使用最小花费爬楼梯| 62.不同路径| 63不同路径2| 343.正数拆分 | 96.不同的二叉搜索树

    509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n 1 给定 n ,请计算 F(n) 。 70.爬楼梯 746.使用最小花费爬楼梯 给你一个整数

    2023年04月23日
    浏览(47)
  • 【学会动态规划】最小路径和(9)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 题目链接:64. 最小路径和 - 力扣(Leet

    2024年02月16日
    浏览(25)
  • Java 动态规划 64. 最小路径和

      代码展示:  dp[i][j]=Math.min(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1];  该题可以通过动态规划解决,动态规划的题根据以下的5大步骤便可轻松解决         1.状态表示                 题目要求我们计算从起点到最后一个位置的最小路径和,我们可以创建一个dp表,dp【i】【j】表示从

    2024年02月13日
    浏览(32)
  • 【学会动态规划】下降路径最小和(8)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 题目链接:931. 下降路径最小和 - 力扣(

    2024年02月16日
    浏览(31)
  • 动态规划问题——矩阵的最小路径和

    题目: 给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有路径中最小的路径和。 示例: 给定的m如下: 1        3         5        9 8        1        3        4  5        0        6 

    2023年04月08日
    浏览(39)
  • 最小路径和-力扣64-java 动态规划

    给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 1: 输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→1→1 的总和最小。 示例 2: 输入:grid = [[1,

    2023年04月09日
    浏览(35)
  • 【动态规划刷题 5】 最小路径和&&地下城游戏

    链接: 64. 最小路径和 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 输入:grid = [[1,3,1],[1,5,1],[4,2,1]] 输出:7 解释:因为路径 1→3→1→1→1 的总和最小。 示例 2: 输入

    2024年02月13日
    浏览(35)
  • 力扣120. 三角形最小路径和(Java 动态规划)

    Problem: 120. 三角形最小路径和 Problem:64. 最小路径和 本题目可以看作是在上述题目的基础上改编而来,具体的思路: 1.记录一个int类型的大小的 n 乘 n n乘n n 乘 n 的数组(其中 n n n 为数组triangle的行数)用于记录 每一个当前阶段的最小路径和 2.大体上可以依据题意得出动态转移

    2024年01月22日
    浏览(29)
  • 【LeetCode:64. 最小路径和 | 暴力递归=>记忆化搜索=>动态规划 】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月05日
    浏览(31)
  • 动态规划|【路径问题】礼物的最大价值(LCR 166.珠宝的最高价值)

    目录 题目 题目解析 思路 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 代码 LCR 166. 珠宝的最高价值 (现在leetcode上面是这个题)这个题跟下面这个题叙述方式一样,就拿下面这个 题来讲解) 题目描述: 在一个m*n的棋盘的每一格都放有一个礼物,每个礼物都有一

    2024年03月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包