动态规划(二)

本文详细介绍了动态规划的三个主要类型:坐标型DP、序列型DP和划分型DP。在坐标型DP中,解决问题需要考虑前一状态的影响,通常需要使用二维数组来存储中间状态。序列型DP则涉及序列问题,解决时依赖于前一状态的信息。划分型动态规划通过将问题划分为子问题来求解。文章提供了相关代码示例。
摘要由CSDN通过智能技术生成

坐标型DP
序列型DP
划分型DP

1.坐标型DP

题目:m行n列网格,从左上角(0,0)位置开始走,有些地方是障碍,不可以走,问有多少种方式走到右下角

DP

/*
	思路:
		1.f[0][0] = 0;
		2.if(i==0 || j==0){
			f[i][j] = 1;
		  }
		3.如果第(i,j)个格子有障碍,则f[i][j]=0
*/
public int solution(int[][] arr){
   

	int m = arr.length;
	if(m == 0){
   
		return -1;
	}

	int n = arr[0].length;
	if(n == 0){
   
		return -1;
	}

	int[][] f = new int[m][n];
	f[0][0]=1;
	for(int i =0;i<m;++i){
   
		for(int j = 0;j<n;++j){
   
			//当给定数组的元素值是1时,表明当前格子是障碍格子
			if(arr[i][j] == 1){
   
				f[i][j] = 0;
			}else{
   
				if(i == 0 || j == 0 ){
   
					//边界
					f[i][j] = 1;
				}else{
   
					f[i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态规划是一种在数学优化中用于求解最优化问题的方法,常用于解决具有重叠子问题和最优子结构的问题,比如维空间中的物品装箱问题。在MATLAB中,可以使用这种算法来高效地解决维空间内如何尽可能多地放置满足大小限制的矩形物体,以达到最小化浪费空间的目的。 具体步骤包括: 1. 定义状态:在这个问题中,状态通常是每个位置(i, j)上能够放下多少个物体,或者能否放下一个特定尺寸的物体。 2. 建立状态转移方程:根据当前位置和物体的尺寸,确定是否能放入,并更新当前位置的状态值,要考虑已经放入的物体对后续放置的影响。 3. 初始化:创建一个维数组来表示状态,通常开始时所有位置都无法放置物体,状态为0。 4. 动态规划遍历:从左上角开始,使用递推的方式填充这个数组,直到遍历完整个维空间。 5. 最终状态:在状态数组右下角的元素将给出在给定尺寸约束下能放置的最大物体数量。 6. 反向追踪:找到放置路径,即回溯状态数组,记录每个位置的最优解。 以下是一个简单的MATLAB代码示例,用于解决维装箱问题: ```matlab function [maxObjects, positions] = twoDimensionalBinPacking(rectangles, maxRectSize) % rectangles: 一个矩形数组,每个元素包含矩形的宽度和高度 % maxRectSize: 可以放入的最大矩形尺寸 % 初始化状态矩阵,所有位置都是未被占用 numRows = size(rectangles, 1); numCols = size(rectangles, 2); dp = zeros(numRows, numCols); % 填充状态矩阵 for i = 1:numRows for j = 1:numCols for rect = rectangles if isInside(rect, [i, j], maxRectSize) && dp(i-rect(1), j-rect(2)) == 0 dp(i, j) = dp(i-rect(1), j-rect(2)) + 1; positions{i, j} = rect; % 保存位置信息 end end end end % 找到最大物品数 maxObjects = max(dp(:)); % 返回最大物品数和位置信息 [~, idx] = max(dp(:)); positions = positions(idx); end % 判断一个矩形是否能完全放入指定位置 function isInside(rect, pos, maxRectSize) return pos(1) >= rect(1) && pos(2) >= rect(2) && pos(1) + rect(1) <= maxRectSize(1) && pos(2) + rect(2) <= maxRectSize(2); end ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值