C#,动态规划(DP)金矿问题(Gold Mine Problem)的算法与源代码

1 金矿问题(Gold Mine Problem)

给定一个N*M尺寸的金矿,每个点都有一个非负数表示当前点所含的黄金数目,最开始矿工位于第一列,但是可以位于任意行。矿工只能向右,右上,右下三个方向移动。问该如何安排路线使得所挖的黄金的数量最多?

2 源程序(2种算法):

using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    public static partial class Algorithm_Gallery
    {
        private static int Collect_Gold(int[,] gold, int r, int c, int n, int m)
        {
            // Base condition.
            if ((r < 0) || (r == n) || (c == m))
            {
                return 0;
            }

            int rightUpperDiagonal = Collect_Gold(gold, r - 1, c + 1, n, m);

            int right = Collect_Gold(gold, r, c + 1, n, m);

            int rightLowerDiagonal = Collect_Gold(gold, r + 1, c + 1, n, m);

            return gold[r, 0] + Math.Max(Math.Max(rightUpperDiagonal, rightLowerDiagonal), right);
        }

        public static int Get_Maxium_Gold(int[,] gold)
        {
            int n = gold.GetLength(0);
            int m = gold.GetLength(1);
            int maxGold = 0;
            for (int i = 0; i < n; i++)
            {
                int goldCollected = Collect_Gold(gold, i, 0, n, m);
                maxGold = Math.Max(maxGold, goldCollected);
            }

            return maxGold;
        }

        private static int Collect_Gold(int[,] gold, int r, int c, int n, int m, int[,] dp)
        {
            if ((r < 0) || (r == n) || (c == m))
            {
                return 0;
            }

            if (dp[r, 0] != -1)
            {
                return dp[r, 0];
            }

            int rightUpperDiagonal = Collect_Gold(gold, r - 1, c + 1, n, m, dp);

            int right = Collect_Gold(gold, r, c + 1, n, m, dp);

            int rightLowerDiagonal = Collect_Gold(gold, r + 1, c + 1, n, m, dp);

            return gold[r, 0] + Math.Max(Math.Max(rightUpperDiagonal, rightLowerDiagonal), right);
        }

        public static int Get_Maxium_Gold_Second(int[,] gold)
        {
            int n = gold.GetLength(0);
            int m = gold.GetLength(1);
            int maxGold = 0;
            int[,] dp = new int[n, m];
            for (int row = 0; row < n; row++)
            {
                for (int col = 0; col < m; col++)
                {
                    dp[row, col] = -1;
                }
            }
            for (int i = 0; i < n; i++)
            {
                int goldCollected = Collect_Gold(gold, i, 0, n, m, dp);
                maxGold = Math.Max(maxGold, goldCollected);
            }

            return maxGold;
        }
    }
}
 

3 源程序

using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{public static partial class Algorithm_Gallery{private static int Collect_Gold(int[,] gold, int r, int c, int n, int m){// Base condition.if ((r < 0) || (r == n) || (c == m)){return 0;}int rightUpperDiagonal = Collect_Gold(gold, r - 1, c + 1, n, m);int right = Collect_Gold(gold, r, c + 1, n, m);int rightLowerDiagonal = Collect_Gold(gold, r + 1, c + 1, n, m);return gold[r, 0] + Math.Max(Math.Max(rightUpperDiagonal, rightLowerDiagonal), right);}public static int Get_Maxium_Gold(int[,] gold){int n = gold.GetLength(0);int m = gold.GetLength(1);int maxGold = 0;for (int i = 0; i < n; i++){int goldCollected = Collect_Gold(gold, i, 0, n, m);maxGold = Math.Max(maxGold, goldCollected);}return maxGold;}private static int Collect_Gold(int[,] gold, int r, int c, int n, int m, int[,] dp){if ((r < 0) || (r == n) || (c == m)){return 0;}if (dp[r, 0] != -1){return dp[r, 0];}int rightUpperDiagonal = Collect_Gold(gold, r - 1, c + 1, n, m, dp);int right = Collect_Gold(gold, r, c + 1, n, m, dp);int rightLowerDiagonal = Collect_Gold(gold, r + 1, c + 1, n, m, dp);return gold[r, 0] + Math.Max(Math.Max(rightUpperDiagonal, rightLowerDiagonal), right);}public static int Get_Maxium_Gold_Second(int[,] gold){int n = gold.GetLength(0);int m = gold.GetLength(1);int maxGold = 0;int[,] dp = new int[n, m];for (int row = 0; row < n; row++){for (int col = 0; col < m; col++){dp[row, col] = -1;}}for (int i = 0; i < n; i++){int goldCollected = Collect_Gold(gold, i, 0, n, m, dp);maxGold = Math.Max(maxGold, goldCollected);}return maxGold;}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/709238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Linux使用Docker部署Nexus容器并实现公网访问本地仓库【内网穿透】

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

Windows虚拟主机如何开启网页debug模式

前不久&#xff0c;有客户咨询想要知道如何开启网页debug模式,以便后期他网站出现异常可以自行排查。这边了解到他当前使用的是Hostease 的Windows 虚拟主机&#xff0c;而开启网页debug模式的操作步骤如下&#xff1a; 1.Hostease的Windows虚拟主机都是带Plesk面板的,因此需要…

HarmonyOS—开发云数据库

您可以在云侧工程下开发云数据库资源&#xff0c;包括创建对象类型、在对象类型中添加数据条目、部署云数据库。 创建对象类型 对象类型&#xff08;即ObjectType&#xff09;用于定义存储对象的集合&#xff0c;不同的对象类型对应的不同数据结构。每创建一个对象类型&#…

盘点6个最受欢迎的 Vue.js UI 库

在2024年&#xff0c;随着Vue.js的不断普及和发展&#xff0c;这个轻量级、易于学习的JavaScript框架在前端开发者中的受欢迎程度日益上升。Vue.js之所以受到青睐&#xff0c;很大一部分原因是其庞大的生态系统&#xff0c;特别是众多的UI库&#xff0c;这些库提供了预先构建的…

Cadence Allegro PCB设计88问解析(三十四) 之 Allegro 中 DDR等长处理

一个学习信号完整性仿真的layout工程师 在进行PCB设计时 &#xff0c;会遇到一些单端的信号要做等长处理&#xff0c;比如DDR的数据线&#xff0c;交换机之间的数据线之类的。这时需要我们建立match group&#xff0c;来做等长。下面简单介绍在Allegro中怎么做等长&#xff1a;…

【c语言】探索联合和枚举---解锁更多选择

前言 上一篇 讲解的是结构体相关知识&#xff0c;接着本篇主要讲解的是 联合和枚举 相关知识 结构体、联合体和枚举都属于 自定义类型。 那么接下来就跟上我的节奏&#xff0c;准备发车~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xf…

Django前后端分离之后端基础3

12 案例&#xff1a;登录_哔哩哔哩_bilibili 参考大佬的B站视频教程笔记 目录 登录接口的实现会话机制成功后的信息保存&#xff1a; 中间件的使用&#xff0c;解决登录保护使未登录过的用户进行登录 Form组件 - 主要作用&#xff1a; Form组件信息的配置 ModelForm组件…

【MySQL】MySQL数据管理——DDL数据操作语言(数据表)

目录 创建数据表语法列类型字段属性SQL示例创建学生表 查看表和查看表的定义表类型设置表的类型 面试题&#xff1a;MyISAM和InnoDB的区别设置表的字符集删除表语法示例 修改表修改表名语法示例 添加字段语法示例 修改字段语法示例 删除字段语法示例 数据完整性实体完整性域完整…

使用Fragments(片段)提升你的Vue.js开发体验

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

HCIA-Datacom实验指导手册:6 构建基础 WLAN 网络

HCIA-Datacom实验指导手册&#xff1a;6 构建基础 WLAN 网络 一、实验介绍&#xff1a;二、实验拓扑&#xff1a;三、实验目的&#xff1a;四、配置步骤&#xff1a;1.掌握ap上线的配置方式和上线过程。ac配置验证 步骤 2 掌握隧道模式和旁挂模式下ac的配置。步骤 3 掌握查看ap…

【Vue3】回顾watch,学习watchEffect

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

mount命令最新详细教程

背景 需要在设备上面&#xff0c;自动化运行u盘里面的脚本&#xff0c;并且进入一个产测模式。因此实际使用了这个mount命令&#xff0c;所以&#xff0c;写了这么一篇供大家参考。 一. 定义 mount命令在Linux和类Unix系统中用于挂载文件系统&#xff0c;即将存储设备…

数仓模型设计方法论

在当今大数据时代&#xff0c;数据已经成为企业最重要的资产之一。而数据仓库作为企业数据管理和分析的核心基础设施&#xff0c;其设计方法论对于企业的数据治理和决策分析至关重要。本文将探索数仓模型设计的方法论&#xff0c;帮助读者更好地理解和应用数仓模型设计。 一、…

从零开始手写RPC框架(1)

学习java后端也有一段时间了&#xff0c;在网上寻一些教程和github上的开源库&#xff0c;学习从零开始手写一个RPC&#xff0c;学习各位大牛的代码适当修改&#xff0c;并贴上自己的一些见解和注释。 目录 RPC简介RPC和HttpClient的区别和共同点常见RPC框架 RPC框架设计常见序…

ISP代理是什么?怎么用?

在跨境出海业务中&#xff0c;代理IP对于您的在线任务至关重要&#xff0c;尤其是对于那些运行多个帐户的人来说。为您的帐户选择正确类型的代理对于确保帐户安全非常重要&#xff0c;劣质的IP容易使账号遭受封号风险。IPFoxy的多种代理IP类型应用范围各有侧重&#xff0c;其中…

html5移动端开发面试,2024年Android开发者常见面试题

Java相关 无论什么级别的Android从业者&#xff0c;Java作为Android开发基础语言。不管是工作还是面试中&#xff0c;Java都是必考题。如果不懂Java的话&#xff0c;薪酬会非常吃亏&#xff08;美团尤为重视Java基础&#xff09; 详细介绍了Java泛型、注解、并发编程、数据传…

“智农”-数字乡村可视化

“智农”打造数字乡村可视化&#xff0c;结合乡村区域实际情况&#xff0c;以规划完善乡村机制体系和更好服务乡村振兴为目标&#xff0c;坚持可持续、可复制、可扩展的建设原则&#xff0c;着力解决农村信息孤岛&#xff0c;提高农村种植技术&#xff0c;加快农村信息化和产业…

Tomcat安装,配置文件、组件

一、Tomcat的基本功能 1.1.Tomcat是什么&#xff1f; Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;T…

《Redis 设计与实现》读书概要

注&#xff1a; 《Redis 设计与实现》一书基于 Redis 2.9 版本编写&#xff0c;部分内容已过时&#xff0c;过时之处本文会有所说明。本文为读书笔记&#xff0c;部分简单和日常使用较少的知识点未记录。原书网页版地址 https://redisbook.com/ 一、底层数据结构 SDS(Simple Dy…

动态规划总结

参考来源&#xff1a;代码随想录 文章目录 基础概念具体应用的问题基础问题背包问题0-1背包完全背包 打家劫舍问题股票买卖问题子序列问题 基础概念 状态推导&#xff1a;动态规划中每一个状态一定是由上一个状态推导出来的。 动规五部曲&#xff1a; 确定dp[i]或者dp[i][j]…