栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

《剑指Offer——连续子数组的最大和,礼物的最大价值》代码

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《剑指Offer——连续子数组的最大和,礼物的最大价值》代码

42.连续子数组的最大和,47.礼物的最大价值
  • 前言
  • 一、示例
    • 1.连续子数组的最大和
    • 2.礼物的最大价值
  • 二、代码解析
    • 1.新建.cpp文件
      • 代码如下(示例):
  • 三,测试


前言

//==================================================================
// 《剑指Offer——连续子数组的最大和,礼物的最大价值》代码
// 题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整
// 数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。
// 题目:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值
// (价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或
// 者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计
// 算你最多能拿到多少价值的礼物?
//==================================================================


一、示例 1.连续子数组的最大和
 
2.礼物的最大价值 
 
二、代码解析 
1.新建.cpp文件 
代码如下(示例): 
//==================================================================
// 《剑指Offer——连续子数组的最大和,礼物的最大价值》代码
// 题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整
// 数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。
// 题目:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值
// (价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或
// 者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计
// 算你最多能拿到多少价值的礼物?
//==================================================================



#include 
#include
#include
using namespace std;


int maxSubArray(vector& nums)
{
	if (nums.empty() || nums.size() <= 0)
	{
		return 0;
	}

	int len = nums.size();
	int nCurSum = 0;
	int nGreatestSum = 0x80000000;
	for (int i = 0; i < len; ++i)
	{
		if (nCurSum <= 0)
		{
			nCurSum = nums[i];
		}
		else
		{
			nCurSum += nums[i];
		}

		if (nCurSum > nGreatestSum)
		{
			nGreatestSum = nCurSum;
		}
	}

	return nGreatestSum;
}




int maxValue1(vector>& grid)
{
	if (grid.empty() || grid.size() <= 0 || grid[0].size() <= 0)
	{
		return 0;
	}
	int row = grid.size();
	int columns = grid[0].size();

	vector> dp(row + 1, vector(columns + 1, 0));
	for (int i = 1; i <= row; ++i)
	{
		for (int j = 1; j <= columns; ++j)
		{
			dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
		}
	}

	return dp[row][columns];
}


int maxValue2(vector>& grid)
{
	if (grid.empty() || grid.size() <= 0 || grid[0].size() <= 0)
	{
		return 0;
	}
	int row = grid.size();
	int columns = grid[0].size();

	vector arr(columns, 0);
	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < columns; ++j)
		{
			int left = 0;
			int up = 0;

			if (i > 0)
				up = arr[j];

			if (j > 0)
				left = arr[j - 1];

			arr[j] = max(left, up) + grid[i][j];
		}
	}

	int maxValue = arr[columns - 1];


	return maxValue;
}

int main()
{
	vector nums = { -2,1,-3,4,-1,2,1,-5,4 };
	cout << "连续子数组的最大和--->" << maxSubArray(nums) << endl << endl;

	vector> grid =
	{
		{1,3,1},
		{1,5,1},
		{4,2,1}
	};
	cout << "礼物的最大价值--->二维数组---->" << maxValue1(grid) << endl << endl;
	cout << "礼物的最大价值--->一维数组---->" << maxValue2(grid) << endl << endl;
	return 0;
}
三,测试

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/289657.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号