动态规划——数塔问题(三维数组的应用)

news2024/11/15 10:13:49

 一、例题要求及理论分析

声明:理论指导《算法设计与分析 第四版》

因为这个地方用到了三维数组,感觉很有意思就故意挑出来分享给大家(三维数组可以看成很多页二维数组)

4.5.1认识动态规划
数塔问题:
如图4-12所示的一个数塔,从顶层到底层或从底层到顶层,在每一结点可以选择向左走或是向右走,要求找出一条路径,使路径上的数值和最大。
问题分析:
(1)不难理解,这个问题用贪婪算法有可能会找不到真正的最大和。以图4-12为例就是如此。采用贪婪策略,无论是自上面下,还是自下而上,每次向下都选择较大的一个数移动,则路径和分别为:

                                 数塔图
9+15+8+9+10=51(自上而下),19+2+10+12+9=52(自下而上)
都得不到最优解,真正的最和是:
9+12+10+18+10=59
(2)要找到最大和的前提条件是,要能看到数塔的全貌,下面的算法设计都是以此为前提的。
在知道数塔全貌的前提下,可以用枚举法或第5章将学习的搜索算法来解决问题。但从图中可以看出,在数塔层数为 n 时,要枚举的路径为2^(n-1)条。在 n 稍大的情况下,需要列举出的路径条数是一个非常庞大的数目。所以枚举法也不是一个适合此问题的算法策略。
(3)这个问题的原始数据是一个三角形的二维图形,而且问题的答案与各层数据间关系复杂,不适合用分治算法分解为与原问题相似的子问题。
下面就学习用动态规划解决此问题。
算法设计:动态规划设计过程如下。
1.阶段划分
从数塔问题的特点来看,不难发现解决问题的阶段划分,应该是自下而上逐层决策。不同于贪婪策略的是做出的不是唯一决策,第一步对于第五层的8个数据,做如下4次决策:
对经过第四层2的路径,在第五层的19,7中选择19;
对经过第四层18的路径,在第五层的7,10中选择10;
对经过第四层9的路径,在第五层的10,4中也选择10;
对经过第四层5的路径,在第五层的4,16中选择16。
这是一次决策过程,也是一次递推过程和降阶过程。因为以上的决策结果将5阶数塔题变为4阶子问题,递推出第四层与第五层的和为:
21(2+19),28(18+10),19(9+10),21(5+16)

用同样的方法还可以将4阶数塔问题变为3阶数塔问题……最后得到的1阶数问题,就是整个问题的最优解。
2、存储、求解
1)原始信息存储
原始信息有层数和数塔中的数据,层数用一个整型变量 n 存储,数塔中的数据用二维数组 data ,存储成如下的下三角阵:

9

12 15

10  6   8

2   18  9  5

19  7  10  4  16

2)动态规划过程存储
由于早期阶段动态规划决策的结果是一组数据,且本次的决策结果是下次决策的唯一依据(无后效性),所以必须在存储每一次决策的结果,若仅仅是求最优解,用一个一维数组存储最新的决策结果即可;但若要同时找出最优解的构成或路径,则必须用二维数组 d 存储各阶段的决策结果。根据上面的算法设计,二维数组 d 的存储内容如下:

 d [ n ][j]= data [ n ][j]    j=1,2,……,n;
 i = n -1, n -2,…,1, j =1,2,…, i 时
 d [ i ][ j ]= max ( d [ i +1][j], d [ i +1][j+1])+ data [ i ][j]
最后 d [1][1]存储的就是问题的结果。

二、代码

#include<stdio.h>
int main()
{
 int a [50][50][3], i , j , n ;
 printf (" please input the number of rows :\n");
 scanf("%d",&n);
 for ( i =1; i <= n ; i = i +1)
   for ( j =1; j <= i ; j = j +1)
    { 
        scanf("%d",&a [ i ][ j ][1]);
        a [ i ][ j ][2]= a [ i ][ j ][1];
        a [ i ][ j ][3]=0;
    }
 for ( i = n -1; i >=1; i = i -1)
   for ( j =1; j <= i ; j = j +1)
    if ( a [ i +1][ j ][2]> a [ i +1][ j +1][2])
        {
        a [ i ][ j ][2]= a [ i ][ j ][2]+ a [ i +1][ j ][2];
        a [ i ][ j ][3]=0;
        }
   else 
       {
       a [ i ][ j ][2]= a [ i ][ j ][2]+ a [ i +1][ j +1][2]; a [ i ][ j ][3]=1;
       }
   printf (" max =%d\n", a [1][1][2]);
    j =1;
for ( i =1; i <= n -1; i = i +1)
{ printf ( "%d->",a [ i ][ j ][1]);
 j = j + a [ i ][ j ][3];
}
 printf ("%d", a [ n ][ i ][1]);
 return 0;
}

三、运行结果 

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

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

相关文章

小型洗衣机哪个牌子质量好?迷你洗衣机排名前十名

随着内衣洗衣机的流行&#xff0c;很多小伙伴在纠结该不该入手一款内衣洗衣机&#xff0c;专门来洗一些贴身衣物&#xff0c;答案是非常有必要的&#xff0c;因为我们现在市面上的大型洗衣机只能做清洁&#xff0c;无法对我们的贴身衣物进行一个高强度的清洁&#xff0c;而小小…

2023年最新prometheus + grafana搭建和使用+gmail邮箱告警配置

一、安装prometheus 1.1 安装 prometheus官网下载地址 sudo -i mkdir -p /opt/prometheus #移动解压后的文件名到/opt/,并改名prometheus mv prometheus-2.45 /opt/prometheus/ #创建一个专门的prometheus用户&#xff1a; -M 不创建家目录&#xff0c; -s 不让登录 useradd…

web服务器之——搭建两个基于不同端口访问的网站

要求如下&#xff1a; 建立一个使用web服务器默认端口的网站&#xff0c;设置DocumentRoot为/www/port/80&#xff0c;网页内容为&#xff1a;the port is 80。建立一个使用10000端口的网站&#xff0c;设置DocumentRoot为/www/port/10000&#xff0c;网页内容为&#xff1a;t…

Centos7 首次 安装Mysql8.0

随笔记录 背景介绍&#xff1a;重装Centos7 系统&#xff0c;没有安装mysql 目录 1. 查看否有MariaDB与MySQL 2. MySQL官网下载适用于centos7的mysql安装包 2.1 查询服务器是x86_64架构还是arm架构 2.2 查系统版本 2.3 下载适用于系统版本安装包 2.3.1 国内镜像源下载…

@Transactional失效问题

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 关于Transactional 日…

应用在LED灯光控制触摸屏中的触摸芯片

LED灯光控制触摸屏方法&#xff0c;包括&#xff1a;建立触摸屏的触摸轨迹信息与LED灯光驱动程序的映射关系&#xff1b;检测用户施加在触摸屏上的触摸轨迹&#xff0c;生成触摸轨迹信息&#xff1b;根据生成的触摸轨迹信息&#xff0c;调用对应的LED灯光驱动程序&#xff0c;控…

算法-05-二分查找

二分查找&#xff08;Binary Search&#xff09;算法&#xff0c;也叫折半查找算法&#xff0c;是一种针对有序数据集合的查找算法。 1-二分查找的思想 我们生活中猜数字的游戏&#xff0c;告诉你一个数据范围&#xff0c;比如0-100&#xff0c;然后你说出一个数字&#xff0c…

​pathlib --- 面向对象的文件系统路径​

3.4 新版功能. 源代码 Lib/pathlib.py 该模块提供表示文件系统路径的类&#xff0c;其语义适用于不同的操作系统。路径类被分为提供纯计算操作而没有 I/O 的 纯路径&#xff0c;以及从纯路径继承而来但提供 I/O 操作的 具体路径。 如果以前从未用过此模块&#xff0c;或不确定…

1、springboot项目运行报错

问题1&#xff1a;获取不到配置文件的参数 我的配置文件获取的参数如下&#xff1a; public class Configures{Value("${configmdm.apk.apkName}")private static String apkName;private void setApkName(String apkName) {Configures.apkName apkName;}private …

k8s详细教程(一)

—————————————————————————————————————————————— 博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码…

OpenSSL 编程指南

目录 前言初始化SSL库创建SSL 上下文接口(SSL_CTX)安装证书和私钥加载证书(客户端/服务端证书)加载私钥/公钥加载CA证书设置对端证书验证例1 SSL服务端安装证书例2 客户端安装证书创建和安装SSL结构建立TCP/IP连接客户端创建socket服务端创建连接创建SSL结构中的BIOSSL握手服务…

数据结构基础介绍

一.起源及重要性 1968 年&#xff0c;美国的高德纳 Donakl E . Kn uth 教授在其所写的《 计算机程序艺术》第一卷《基本算法 》 中&#xff0c;较系统地阐述了数据的逻辑结构和存储结构及其操作&#xff0c; 开创了数据结构的课程体系 &#xff0c;数据结构作为一门独立的…

基于单片机的定时插座在智能家居中的应用

近年来&#xff0c;随着科学技术的发展迅速&#xff0c;人们对智能化的要求越来越高。越来越多的智能化产品进入千家万户&#xff0c;如电脑电视、扫地机器人、智能空气净化器等。这些家居电器和电子产品大都需要连接电源&#xff0c;为满足多种用电器的正常使用&#xff0c;延…

LeetCode力扣每日一题(Java):58、最后一个单词的长度

一、题目 二、解题思路 1、我的思路 先将字符串转换成字符数组 由于我们需要获取最后一个单词的长度&#xff0c;所以我们从后往前遍历字符数组 我们还需判断所遍历的字符是不是字母&#xff0c;即判断每个字符对应的ASCII值即可&#xff0c;用计数器count来储存单词长度 …

sudo -i 和 sudo -s

一、sudo xxx 以root权限执行单条命令 二、sudo -i 进入一个持续的root环境&#xff0c;以root权限执行命令&#xff0c;但并不是切换到root用户 三、sudo -s 也是进入一个持续的root环境&#xff0c;以root权限执行命令&#xff0c;和sudo -i的区别是保存了原来普通用…

记录 DevEco 开发 HarmonyOS 应用开发问题记录 【持续更新】

HarmonyOS 应用开发问题记录 HarmonyOS 应用开发问题记录一、预览器无法成功运行?如何定位预览器无法编译问题? 开发遇到的问题 HarmonyOS 应用开发问题记录 一、预览器无法成功运行? 大家看到这个是不是很头疼? 网上能看到许多方案,基本都是关闭一个配置 但是他们并…

在线课堂知识付费小程序源码系统 开发组合PHP+MySQL:用手机随时随地地学习,讲师亲自在线授业解惑 带安装部署教程

近年来&#xff0c;人们对于学习的需求也日益增加。传统的课堂教学已经无法满足人们的学习需求&#xff0c;而在线课堂则能够让人们随时随地地进行学习。同时&#xff0c;随着知识付费的兴起&#xff0c;越来越多的讲师也愿意将自己的知识和经验分享给更多的人。因此&#xff0…

【QT入门】基础知识

一.认识Qt qt是一套应用程序开发库&#xff0c;与MFC不同是跨平台的开发类库&#xff0c;主要用来开发图形界面。完全面向对象容易扩展。 优点&#xff1a;1.封装性强&#xff0c;简单易学 2.跨平台 3.独立编译为本地代码 二.qt工程 1.常见的工程文件有这两种…

PDF文件的限制编辑,如何设置?

想要给PDF文件设置一个密码防止他人对文件进行编辑&#xff0c;那么我们可以对PDF文件设置限制编辑&#xff0c;设置方法很简单&#xff0c;我们在PDF编辑器中点击文件 – 属性 – 安全&#xff0c;在权限下拉框中选中【密码保护】 然后在密码保护界面中&#xff0c;我们勾选【…

DevEco Studio 生成HPK文件

DevEco Studio 生成HPK文件 一、安装环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、生成HPK文件 生成的HPK文件存放在entry文件夹下。下图是未生成HPK的样式。 生成HPK&#xff1a;菜单Build->Build Hap(s)/APP(s)->Build Hap(s)…