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.hqwc.cn/news/497168.html

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

相关文章

Java项目:29 基于SpringBoot+thymeleaf实现的图书管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 基于SpringBootthymeleaf实现的图书管理系统分为管理员、读者两个登录角色&#xff0c;一共是8个功能模块 管理员权限 图书管理&#xff1a; 添加图…

论文设计任务书学习文档|基于智能搜索引擎的图书管理系统的设计与实现

文章目录 论文(设计)题目:基于智能搜索引擎的图书管理系统的设计与实现1、论文(设计)的主要任务及目标2、论文(设计)的主要内容3、论文(设计)的基本要求4、进度安排论文(设计)题目:基于智能搜索引擎的图书管理系统的设计与实现 1、论文(设计)的主要任务及目标 …

STM32 Cubemx配置SPI编程(使用Flash模块)

文章目录 前言一、W25Q64模块介绍二、STM32Cubemx配置SPI三、SPI HAL库操作函数分析3.1查询方式3.2中断方式 四、Flash时序分析1.读器件ID指令2.写使能3.擦除扇区4.页编程5.读数据6.读状态寄存器 五、Flash驱动程序编写1.代码编写测试 总结 前言 本篇文章来为大家讲解一下Flas…

安全评估与安全评价:区分核心概念

在当今信息化社会中&#xff0c;保护数据和网络安全变得尤为重要。为了确保系统和组织的安全&#xff0c;我们需要了解并正确运用安全评估和安全评价这两个核心概念。虽然它们听起来相似&#xff0c;但其实它们有着不同的定义和目的。 首先&#xff0c;安全评估是一种系统性的…

如何选择合适的汽车芯片ERP系统?

随着汽车产业的飞速发展&#xff0c;汽车芯片作为关键组件&#xff0c;其管理变得愈发重要。为了高效管理汽车芯片的生产、销售、库存等各个环节&#xff0c;许多企业开始引入汽车芯片ERP(企业资源规划)系统。那么&#xff0c;如何选择合适的汽车芯片ERP系统呢? 明确需求是关键…

unity学习(42)——创建(create)角色脚本(panel)——UserHandler(收)+CreateClick(发)——服务器收包2

1.解决上一次留下的问题&#xff1a; log和reg的时候也有session&#xff0c;输出看一下这两个session是同一个不&#xff1a; 实测结果reg log accOnline中的session都是同一个对象&#xff0c;但是getAccid时候的session就是另一个了。 测试结果&#xff0c;说明在LogicHan…

liunx操作系统 进程的基本概念

进程的基本概念 计算机结构体系冯诺依曼 操作系统的管理进程进程的特性标识符系统的调用 创建新的进程 进程的状态进程队列进程的状态在liunx查看进程状态、 计算机结构体系 冯诺依曼 在没有存储器之前&#xff0c;所有的信息都是直接进入CPU&#xff0c;这样效率很差&#xf…

【Python笔记-设计模式】观察者模式

一、说明 观察者模式是一种行为设计模式&#xff0c;允许你定义一种订阅机制&#xff0c;可在对象事件发生时通知“监控”该对象的其他对象。 (一) 解决问题 主要解决一个对象的状态变化时&#xff0c;需要通知其他对象&#xff0c;并且这些被通知的对象可能是多个且不确定的…

【Dubbo】什么是Dubbo?它的架构和负载均衡策略,以及zookeeper宕机与dubbo直连的情况

目录 一 重要的概念 1.1 什么是 Dubbo? 1.2 什么是 RPC?RPC原理是什么? 1.3 为什么要用 Dubbo? 1.4 什么是分布式? 1.5 为什么要分布式? 二 Dubbo 的架构 2.1 Dubbo 的架构图解 2.2 Dubbo 工作原理 三 Dubbo 的负载均衡策略 3.1 先来解释一下什么是负载均衡 3…

yolov5v7v8目标检测增加计数功能--免费源码

在yolo系列中&#xff0c;很多网友都反馈过想要在目标检测的图片上&#xff0c;显示计数功能。其实官方已经实现了这个功能&#xff0c;只不过没有把相关的参数写到图片上。所以微智启软件工作室出一篇教程&#xff0c;教大家如何把计数的参数打印到图片上。 一、yolov5目标检测…

德人合科技 | 天锐绿盾终端安全管理系统

德人合科技提到的“天锐绿盾终端安全管理系统”是一款专业的信息安全防泄密软件。这款软件基于核心驱动层&#xff0c;为企业提供信息化防泄密一体化方案。 www.drhchina.com 其主要特点包括&#xff1a; 数据防泄密管理&#xff1a;天锐绿盾终端安全管理系统能够确保数据在创…

HUAWEI 华为交换机 配置基于VLAN的MAC地址学习限制接入用户数量 配置示例

组网需求 如 图 2-15 所示&#xff0c;用户网络 1 通过 LSW1 与 Switch 相连&#xff0c; Switch 的接口为 GE0/0/1 。用户网络2通过 LSW2 与 Switch 相连&#xff0c; Switch 的接口为 GE0/0/2 。 GE0/0/1 、 GE0/0/2 同属于 VLAN2。为控制接入用户数&#xff0c;对 VLAN2 进…