代码编织梦想

题目描述

 

 思路分析

设Ipomy走到位置(i,j)所得到的价值之和为value(i,j),那么为了研究问题的方便我们不妨先研究其走到出口时的情况,即假设现在的状态是Ipomy已经走到了出口即处于位置(m-1,n-1),那么由于Ipomy只能向右走或者向下走,所以他的上一个状态要么是在(m-2,n-1)要么是在(m-1,n-2),而要让他走到(m-1,n-1)位置处获得最大价值,那么其走到上一步时获得的价值也应该是最大的,所以此问题又变成了问题规模减小了的求“获得最大价值”的问题,写到这儿,递归思想已经出来了。

程序源代码以及运行结果截图如下,在代码中给出了完整的注释

程序源代码

//夺取宝藏问题

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>


int max(int a, int b);          //用于返回两个数中较大的一个;
int max_value(int **array, int m, int n);


int main()
{
	int m, n,max_sum;
	int** hide;          //hide是一个二级指针,是指向指针的指针
	
	
	while (scanf("%d%d", &m, &n) != EOF)
	{
		hide = (int**)malloc(sizeof(int*) * m);     
		for (int i = 0; i < m; i++)
		{
			hide[i] = (int*)malloc(sizeof(int) * n);
		}//为二维数组动态申请内存
		
		for (int i = 0; i < m; i++)
		{
			for (int j = 0; j < n; j++)
			{
				scanf("%d", &hide[i][j]);
			}
		}
		
		max_sum = max_value(hide, m - 1, n - 1);
		printf("%d\n", max_sum);	

		for (int i = 0; i < m; i++)
			free(hide[i]);
		free(hide);
		
	}
	
	return 0;
}



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



int max_value(int **array,int m, int n)      
{
	
	if (m == 1 && n == 0)
		return array[1][0];                            
	if (m == 0 && n == 1)      
		return array[0][1];                  //递归出口即当其到达(0,1)位置或者(1,0)位置时即为递归出口。
	if (m >= 2 && n == 0)
		return max_value(array, m - 1, n) + array[m][n];
	else if (m == 0 && n >= 2)
		return max_value(array, m, n - 1) + array[m][n];                    //这里需要说明的是,很显然当到达第一行或者第一列时没有办法继续对行或者列进行减一操作
	else
	{
		return max(max_value(array, m - 1, n) + array[m][n], max_value(array, m, n - 1) + array[m][n]);             //取两种路径中获得价值最大的一条路径         
	}
	//算法思路,先考虑ipomy走到最后的出口的前一步是在哪里,由于只能向右或者向下,所以其前一格不是在(m-1,n)就是在(m,n-1),
	//若要价值之和最大,那么要求其从第一步到最后一步的前一步的价值之和也是最大的,所以就把问题拆分成了解法相同,问题规模不同的一些子问题,
	//可用递归方法求解	
	
}


运行结果截图

但是值得注意的是,由于此题二维数组的大小不确定,所以我们采用动态分配内存的方法,比直接将其定义为一个很大的数组hide[1000][1000]要好的多,直接将其定义为很大的数组会造成空间的浪费,而且需要内存中有那么多连续的存储空间才能申请成功。

动态内存分配的方法,可以先为二维数组的第一维申请内存空间,再分别为每一维申请内存空间

代码如下

hide = (int**)malloc(sizeof(int*) * m);     //即先为第一维申请内存空间第一维即二维数组的行,二维数组的行本身是一个一维数组,而一维数组名是指向数组中第一个元素的地址,所以此时返回的是一个二级指针,即指向指针的指针。
for (int i = 0; i < m; i++)
{
	hide[i] = (int*)malloc(sizeof(int) * n);
}//为二维数组动态申请内存
		

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mili_j/article/details/129678779

九度oj—题目1549:货币问题-爱代码爱编程

题目描述: 已知有面值为1元,2元,5元,10元,20元,50元,100元的货币若干(可认为无穷多),需支付价格为x的物品,并需要恰好支付,即没有找零产生。 求,至少需要几张货币才能完成支付。 如,若支付价格为12元的物品,最少需要一张10元和一张2元,即两张货币就可完成支付。 输入:

【杭电oj】 汉诺塔问题及其变形算法分析-爱代码爱编程

 汉诺塔问题及其变形算法分  写在前面: 本文章属于小编从网上整合而来! 引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究。最简单的汉诺塔是三个柱子(A、B、C),因此多柱汉诺塔的柱子个数M≥3。下面从三柱汉诺塔说起,慢慢深入我们要关心的问题。 1. 三柱汉诺塔

java算法---华为oj迷宫问题求解(深度优先搜索)-爱代码爱编程

  自己花了好长时间学习了深度优先搜索算法,受益颇多,网上许多资料都看不太懂,最后自己按着那个思想一步一步实现了,分享一下,以华为oj上的迷宫问题为例来说一下: 问题描述: 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5×5数组下所示:   int maze[5][5]={ 0, 1, 0, 0, 0,

java算法---华为oj迷宫问题求解(广度优先搜索)-爱代码爱编程

  一万年太久,只争朝夕,只有坚持,才能胜利,经过昨天的努力,解决了广度优先算法实现迷宫问题,题目在这里不赘述,如果不知道题目的请看我的上一篇博客Java算法---华为oj迷宫问题求解,这里面说的很详细,下来就直奔主题,说说广度优先搜索。   一般谈起广搜,我的第一反应就是求最短路径,因为广搜是由内向外逐层扩散,最后肯定能找到一个最短的路径,其实用法也不

算法设计与分析(屈婉玲)网络课学习笔记(一)_量化橙同学的博客-爱代码爱编程

2017.10.10 21:47 放一波课程的链接首先:http://www.chinesemooc.org/live/685712    华文慕课 北京大学屈婉玲女神的视频教程,非常推荐  学习算法,一定是计算机专业同学学习历程的重中之重 大三时候去参加了一个游戏公司的笔试,仗着自己有一点点OpenGL和游戏引擎的基础,想试试,结果不料试卷上全是算

挑战程序设计竞赛2 算法与数据结构 笔记_peiwen123的博客-爱代码爱编程_挑战程序设计竞赛2 算法和数据结构

第一部分 学习方法 第一章 使用 AOJ 会津大学OJ 国内有的时候访问AOJ比较卡,可以使用 vjudge 来做题. 第二部分 基础数据结构和算法 第二章 算法和复杂度 第三章 初等排序 3.2 插入排序法

OJ 题目中 时间限制与内存限制 复杂度的估计-爱代码爱编程

运行时限为1s,这很常见,对于该时限,我们设计的算法复杂度不能超过百万级别,即不要超过一千万。假如算法时间复杂度为 O ( n

【螺钉和螺母问题】【算法分析与设计】假设我们有n个直径各不相同的螺钉以及n个相应的螺母...-爱代码爱编程

教材原题 假设我们有n个直径各不相同的螺钉以及n个相应的螺母。我们一次只能比较一对螺钉和螺母,来判断螺母是大于螺钉、小与螺钉还是正好适合螺钉。然而我们不能拿两个螺母做比较,也不能拿两个螺钉做比较。 我们的问题是要找到每一对匹配的螺钉和螺母。为该问题设计一个算法,它的平均效率必须属于Θ(n log n)。 题意分析 可能看完题目,不

算法设计与分析:世界名画陈列馆问题(可重复监视) (回溯法 & 分支限界法)-爱代码爱编程

世界名画陈列馆问题 Description:  世界名画陈列馆由m´n个排列成矩形阵列的陈列室组成。为了防止名画被盗,需要在陈列室中设置警卫机器人哨位。每个警卫机器人除了监视它所在的陈列室外,还可以监视与它所在的陈列室相邻的上、下、左、右4 个陈列室。试设计一个安排警卫机器人哨位的算法, 使得名画陈列馆中每一个陈列室都在警卫机器人的监视之下

算法竞赛常见赛制及题目形式-爱代码爱编程

前言         本文介绍了算法竞赛中的三种常见赛制,题目形式,并以实例说明了如何处理最常见的多组数据输入输出问题。 一、算法竞赛常见赛制         目前的算法竞赛通常使用三种赛制,即ACM赛制、OI赛制以及IOI赛制。要方便理解这三种赛制,我们可以把每种赛制分为提交反馈和计分方式两方面来区分。下面将具体说明三种赛制的规则以及相应的比

【算法设计与分析】17103基站建设(贪心算法)-爱代码爱编程

step by step. 目录 题目 Description 输入格式 输出格式 输入样例 输出样例 提示 代码 题目 Description 一条很长的乡村公路(我们可以想象这条公路是一条长线段,有一个西端点和一个东端点),公路旁稀疏的分布着一些房子。 我们把公路的西端点固定在坐标0上,东端点为某远处。 假设这些房子的居民

夺取宝藏-爱代码爱编程

题目描述 Ipomy 现在来到了阿兹特克宝藏堆中。这些宝藏散落放在一个 m * n 的网格上,每个宝藏都有一个价值。Ipomy 自然是希望将所有宝藏统统拿走,但他在走出迷宫时,不小心中了魔咒,一次只能向下或向右移动一步。假设 Ipomy 身处网格的左上角,而古城的出口在右下角,他想在离开古城前,拿到价值之和尽可能大的宝藏。请你编写程序,帮助他计算他可以拿

算法竞赛常用OJ食用指南-爱代码爱编程

前言 在准备像ICPC、CCPC、蓝桥杯之类的算法竞赛时,学习完相应的知识点后往往需要大量刷题来巩固,一个OJ的好坏程度我认为可以根据以下几个方面来评定: 1.题目的质量 2.题解的质量 3.比赛的质量 除此之外还有如UI设计、在线编译器等等 每个OJ都有自己不同的特点,需要我们在有需要的时候使用,下面就为大家详细描述如何利用常见的OJ来帮助自己成长,这

【算法】第三届全国大学生算法设计与编程挑战赛(冬季赛)-爱代码爱编程

7题金,6题银,5题铜 【参考:2021-2022年度第三届全国大学生算法设计与编程挑战赛(冬季赛)题解_int 我的博客-CSDN博客】 【参考:2021-2022年度第三届全国大学生算法设计与编程挑战赛 【

利用剪枝降低bfs算法的时空复杂度(一道oj题目)_bfs降低时间复杂度方法-爱代码爱编程

作者:非妃是公主 专栏:《算法》《刷题笔记》 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 《算法》专栏系列文章 算法设计与分析复习01:主方法求递归算法时间复杂度 算法设计与分析复习0