动态规划进阶

理论解析

动态规划其实就是记住之前问题的答案,然后利用之前问题的答案来分析并解决当前问题,这里面有两个非常重要的步骤,就是 拆解问题 和 定义状态

这次来针对具体的一类动态规划问题,矩阵类动态规划问题,来看看针对这一类问题的思路和注意点。

矩阵类动态规划,也可以叫做坐标类动态规划,一般这类问题都会给你一个矩阵,矩阵里面有着一些信息,然后你需要根据这些信息求解问题。

一般来说,在思考这类动态规划问题的时候,我们只需要思考当前位置的状态,然后试着去看当前位置和它邻居的递进关系,从而得出我们想要的递推方程,这一类动态规划问题,相对来说比较简单

不同路径

说明: m 和 n 的值均不超过 100。

题目解析:

  • 问题拆解:题目中说了,每次移动只能是向右或者是向下,矩阵类动态规划需要关注当前位置和其相邻位置的关系,对于某一个位置来说,经过它的路径只能从它上面过来,或者从它左边过来,因此,如果需要求到达当前位置的不同路径,我们需要知道到达其上方位置的不同路径,以及到达其左方位置的不同路径
  • 状态定义:矩阵类动态规划的状态定义相对来说比较简单,只需要看当前位置即可,问题拆解中,我们分析了当前位置和其邻居的关系,提到每个位置其实都可以算做是终点,状态表示就是 “从起点到达该位置的不同路径数目
  • 递推方程:dp[i][j]=dp[i][j-1]+dp[i-1][j]
  • 实现:我们还要考虑状态数组的初始化问题,对于上边界和左边界的点,因为它们只能从一个方向过来,需要单独考虑,比如上边界的点只能从左边这一个方向过来,左边界的点只能从上边这一个方向过来,它们的不同路径个数其实就只有 1,提前处理就好。
#include <iostream>
#include <cstdio>
#include <algorithm> 
using namespace std;
int main(){
	int m,n;//行,列
	cin >>m>>n;
	int dp[m][n];
	for(int i=0;i<n;i++){
		dp[0][i]=1;
	}
	for(int i=0;i<m;i++){
		dp[i][0]=1;
	}
	for(int i=1;i<m;i++){
		for(int j=1;j<n;j++){
			dp[i][j]=dp[i-1][j]+dp[i][j-1];
		}
	}
	cout <<dp[m-1][n-1];
	return 0;
} 

不同路径(有障碍物)

题目解析

在上面那道题的基础上,矩阵中增加了障碍物,这里只需要针对障碍物进行判断即可,如果当前位置是障碍物的话,状态数组中当前位置记录的答案就是 0,也就是没有任何一条路径可以到达当前位置,除了这一点外,其余的分析方法和解题思路和之前 一样 

#include <iostream>
#include <cstdio>
int dp[100][100];
using namespace std;
int main(){
	int m,n;
	cin >>m>>n;
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			cin >>dp[i][j];
		}
	}
	for(int i=0;i<n;i++){
		dp[0][i]=(dp[0][i]==1)?0:1; 
	}
	for(int i=0;i<m;i++){
		dp[i][0]=(dp[i][0]==1)?0:1;
	}
	for(int i=1;i<m;i++){
		for(int j=1;j<n;j++){
			dp[i][j]=(dp[i][j]==1)?0:dp[i-1][j]+dp[i][j-1];
		}
	}
	cout <<dp[m-1][n-1];
	return 0;
} 

最小路径和

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

题目解析:

  • 问题拆解:到达终点pb[i][j]的数字最小和,及求到达pb[i][j-1],pb[i-1][j]最小和
  • 状态定义:状态表示是 “从起点到达该位置的最小和
  • 递推方程:dp[i][j]=min(dp[i][j-1],dp[i-1][j])
  • 实现:我们还要考虑状态数组的初始化问题,对于上边界和左边界的点,因为它们只能从一个方向过来,需要单独考虑,比如上边界的点只能从左边这一个方向过来,其路径最小和就是到达左边元素的最小和
发布了107 篇原创文章 · 获赞 18 · 访问量 6303

猜你喜欢

转载自blog.csdn.net/qq_43109978/article/details/104075879