`
jiq408694711
  • 浏览: 36541 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

动态规划求解矩阵累计和最大的路径

 
阅读更多
/**
* 有一个 M x N 的矩阵,其中每个格子里面都有特定的钱。
* 左上角走到右下角,只能向右或者向下走,问怎么走才能捡到最多的钱。
* 输出捡钱的路径。
* 解析: 动态规划。 首先找到子结构,构造递推式。
* 对于每个位置能捡到的最多的钱是:
*		a[i][j] = max{a[i-1][j] + w[i][j],a[i][j-1] + w[i][j]}
*/

#include <stdio.h>
#define M 5
#define N 4
int w[M][N];	//矩阵
int a[M][N];	//当前捡到的最大的钱的值
int path[M][N];	//记录路径,1表示从上面捡着钱下来,0表示从左边捡着钱过来

void find_path(){
	int i,j;
	a[0][0] = w[0][0];
	//初始化左边界
	for(i=0;i<M;i++){
		a[i][0] = a[i-1][0] + w[i][0];
		path[i][0] = 1;
	}

	//初始化右边界
	for(j=0;j<N;j++){
		a[0][j] = a[0][j-1] + w[0][j];
		path[0][j] = 0;
	}
	
	//两个循环开始自底向上求解
	for(i=1;i<M;i++){
		for(j=1;j<N;j++){
			int up = a[i-1][j] + w[i][j];
			int left = a[i][j-1] + w[i][j];
			if(up > left){
				a[i][j] = up;
				path[i][j] = 1;
			}
			else{
				a[i][j] = left;
				path[i][j] = 0;
			}
		}
	}
}

int main(){
	int tmp[M][N] = {{4,3,12,1},{11,7,4,2},{6,20,15,2},{4,5,8,1},{3,3,4,6}};
	int i,j;

	//初始化矩阵
	for(i=0;i<M;i++)
		for(j=0;j<N;j++){
			w[i][j] = tmp[i][j];
		}
	printf("\n\n");

	//自底向上求解
	find_path();

	//打印出路径以及每个位置能捡到的最多的钱数
	for(i=0;i<M;i++){
		for(j=0;j<N;j++)
			printf("%5d(%d)",a[i][j],path[i][j]);
		printf("\n");
	}
	return 0;
}

运行结果:


分享到:
评论

相关推荐

    动态规划法之多边形游戏问题

    动态规划的目标是找到一条序列,使得从初始状态到最后状态的累计得分最大。 状态转移方程是动态规划问题的核心,它描述了如何从一个状态转移到另一个状态并计算出相应的价值。对于多边形游戏,这可能是: `dp[i][j...

    基于蚁群算法的机器人路径规划研究.pdf

    【蚁群算法与机器人路径规划】蚁群算法是一种模拟自然界中蚂蚁寻找食物行为的全局智能优化算法,它具有良好的全局探索能力和自适应性,常被应用于复杂问题的求解,如机器人路径规划。在机器人路径规划中,蚁群算法...

    随机动态规划的实例的matlab代码.zip

    总的来说,这个压缩包中的MATLAB代码提供了一个学习和实践随机动态规划的实例,通过运行和分析代码,可以深入理解SDP的工作原理以及如何在MATLAB环境中实现它。对于学习控制理论、优化或决策科学的学生和研究人员来...

    最小生成树计数结题报告与代码

    Floyd-Warshall算法通常用于求解所有对最短路径,但我们可以利用其动态规划的性质来处理最小生成树的问题。我们可以创建一个邻接矩阵来表示图的边和权重,然后使用矩阵运算来寻找可能的最小生成树组合。 在C++代码...

    剑指offer参考答案

    在矩阵中从左上角走到右下角,需要找到一条路径使得从左上角到右下角的累计值最小或最大,或者路径本身满足某种条件。这类问题的解决方法往往需要构建一个与原矩阵大小相同的二维数组,用于存储到达每个点的最优解或...

    dtw.rar_dtw_dtw matlab_matlab_matlab计算dtw_时间序列

    3. **动态规划求解**:应用动态规划算法,通过定义边界条件和状态转移方程,找到代价最小的路径。这个路径反映了两个序列的最佳匹配方式。 4. **回溯最优路径**:从矩阵的右下角开始,沿着最小成本路径回溯,得到...

    SpeechRec.zip_SpeechRec_孤立词

    4. **动态规划求解**:通过DTW算法,找到从矩阵左上角到右下角的最小累计距离路径,即最佳匹配路径。 5. **后处理**:根据最佳路径,确定输入语音与模板语音的相似度,进而实现识别。 这个MATLAB小实例可能包括了...

    第十三届蓝桥杯省赛真题模拟题原题

    这需要使用动态规划或者贪心策略来求解,找到最优路径。 第四题是螺旋矩阵问题。螺旋矩阵是一种特殊的矩阵填充方式,要求找出特定位置的值。对于这类问题,可以通过模拟螺旋填充的过程,或者根据螺旋规律直接计算出...

    马尔科夫决策过程的matlab编程实现

    马尔科夫决策过程(Markov Decision Process,简称MDP)是运筹学和人工智能领域中的一种重要模型,用于描述一个决策者(智能体)在不确定环境中如何进行长期规划和决策,以最大化期望的累计奖励。MATLAB作为一种强大...

    数据结构的上机作业答案

    1) 求稀疏矩阵的加,乘和转置矩阵。 2) 求广义表的深度。 实验6:树和二叉树 1) 求赫夫曼编码。(w存放n个字符的权值(均&gt;0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC) 实验7:图 1)实现教科书中图...

    mdp(马尔可夫决策过程)2009年matlab源码,非常详细全面,非常实用

    在MATLAB源码中,我们可以期待看到如何实现这些概念,包括如何定义状态和动作空间,构建状态转移概率矩阵,设计奖励函数,以及如何使用动态规划算法(如价值迭代或策略迭代)来求解最优策略。源码还可能包含一些可视...

    main.rar_MDP MATLAB_mdp program_马尔科夫_马尔科夫决策_马尔科夫过程

    MDP主要用于解决具有随机性和长期优化的决策问题,例如机器人路径规划、资源管理、游戏策略等。 MATLAB是一种强大的编程环境,特别适合进行数值计算和科学可视化。在给定的"main.rar"压缩包中,包含了一个名为"main...

    【老生谈算法】物流配送路线matlab源程序.docx

    - 在每次迭代过程中,根据当前路径和已知的最佳路径进行比较,如果当前路径更优,则更新最佳路径的相关信息。 #### 3. 关键算法概念 文档中的代码片段体现了以下算法思想: - **邻接矩阵**:用于表示图中各节点间...

    matlab开发-iLQGDDPtrajectoryoptimization.zip

    这个压缩包“matlab开发-iLQGDDPtrajectoryoptimization.zip”可能包含了实现这两种算法的MATLAB代码,用于解决机器人路径规划、控制系统设计或其他动态系统的最优控制问题。 iLQG 算法是一种在线学习控制策略,它...

    上交复试机试

    综上所述,上海交通大学复试机试题目涵盖了多个方面的算法和数据结构知识,包括但不限于字符串处理、数据结构设计、动态规划、递归算法等。通过练习这些题目,可以帮助考生提高解决问题的能力和编程技巧。

    matlab代码快速生成器

    积分计算可以用于解决物理问题中的面积、体积或物理量的累计,而微分则常用于求解函数的瞬时变化率,如速度和加速度。这款代码生成器可能通过提供预设模板或自动化的代码生成流程,帮助用户快速实现这些功能,避免...

    matlab程序匈牙利算法指派问题.zip

    3. **增广路径**:寻找当前解中可以改进的部分,即存在一条增广路径,使得路径上工作者的累计任务价值增加,而路径上任务的累计工作者价值减少。 4. **调整**:通过调整增广路径上的权重,使所有工作者的任务价值...

    第12讲_线性二次调节器(LQR)法1

    在智能汽车路径规划和轨迹跟踪中,LQR法可以有效地实现稳定且节能的轨迹跟踪,同时考虑到偏差的快速收敛和控制输入的最小化。在Matlab环境中,LQR的计算和实现相对简单,是解决这类问题的常用工具。

    实验指导11

    - **统计函数**:包括`max`(求最大值)、`min`(求最小值)、`median`(求中位数)、`mean`(求平均值)、`std`(求标准差)、`prod`(求积)、`sum`(求和)、`cumsum`(累计和)、`cumprod`(累计积)、`cov`...

Global site tag (gtag.js) - Google Analytics