当前位置: 首页 > news >正文

数塔问题(蛮力算法和动态规划)

题目:如下图是一个数塔,从顶部出发在每一个节点可以选择向左或者向右走,一直走到底层,要求找出一条路径,使得路径上的数字之和最大,及路径情况。(使用蛮力算法和动态规划算法分别实现)

#include<bits/stdc++.h>
#define MAX_SIZE 100 
using namespace std;
//蛮力算法
int maxPathSumForce(int pyramid[][MAX_SIZE],int row){if(row==1){return pyramid[0][0];}int maxSum=pyramid[0][0];for(int i=1;i<row;i++){for(int j=0;j<i;j++){if(j==0){pyramid[i][j]+=pyramid[i-1][j];		}else if(j==i){pyramid[i][j]+=pyramid[i-1][j-1];}else{pyramid[i][j] += (pyramid[i - 1][j - 1] > pyramid[i - 1][j] ? pyramid[i - 1][j - 1] : pyramid[i - 1][j]);}if (pyramid[i][j] > maxSum) {maxSum = pyramid[i][j];}
}}return maxSum;
} //动态规划算法int maxPathSumDP(int pyramid[][MAX_SIZE], int rows) {if (rows == 1) {return pyramid[0][0];}for (int i = rows - 2; i >= 0; i--) {for (int j = 0; j <= i; j++) {pyramid[i][j] += (pyramid[i + 1][j] > pyramid[i + 1][j + 1] ? pyramid[i + 1][j] : pyramid[i + 1][j + 1]);}}return pyramid[0][0];
}signed main()
{int pyramid[MAX_SIZE][MAX_SIZE];int row,num;cout<<"请输入数塔的层数:";cin>>row;cout<<"请输入数塔的数字(每层从左到右依次输入):"<<endl;for(int i=0;i<row;i++){for(int j=0;j<=i;j++){cin>>num;pyramid[i][j]=num;}}cout<<"蛮力算法最大路径和为:"<<maxPathSumForce(pyramid,row)<<endl;cout<<"动态规划算法最大路径和为:"<<maxPathSumDP(pyramid,row)<<endl; } 

蛮力算法的解释:

1. 首先,如果金字塔只有一行(rows == 1),则直接返回金字塔顶部的值(pyramid[0][0])。

2. 初始化最大路径和为金字塔顶部的值(maxSum = pyramid[0][0])。

3. 使用两个嵌套的循环遍历金字塔的每一行和每一列。外层循环变量i表示行数,内层循环变量j表示列数。

4. 在内层循环中,根据当前位置的行数和列数,计算当前位置的值。具体计算方式如下:
- 如果当前位置是行的开头(j == 0),则当前位置的值等于上一行同列位置的值加上当前位置的值(pyramid[i][j] += pyramid[i - 1][j])。
- 如果当前位置是行的末尾(j == i),则当前位置的值等于上一行前一列位置的值加上当前位置的值(pyramid[i][j] += pyramid[i - 1][j - 1])。
- 否则,当前位置的值等于上一行前一列位置的值和上一行同列位置的值中的较大值(pyramid[i][j] += (pyramid[i - 1][j - 1] > pyramid[i - 1][j] ? pyramid[i - 1][j - 1] : pyramid[i - 1][j]))。

5. 在内层循环中,每次更新当前位置的值后,判断当前位置的值是否大于最大路径和(maxSum)。如果是,则更新最大路径和为当前位置的值。

动态规划算法的解释:(从下到上代码更加简洁,可能性更小)

1. 首先,如果金字塔只有一行(rows == 1),则直接返回金字塔顶部的值(pyramid[0][0])。

2. 使用两个嵌套的循环从倒数第二行开始向上遍历金字塔的每一行和每一列。外层循环变量i表示行数,内层循环变量j表示列数。

3. 在内层循环中,根据当前位置的行数和列数,计算当前位置的值。具体计算方式如下:
- 当前位置的值等于当前位置的值加上 下一行同列位置和下一行下一列位置中的较大值(pyramid[i][j] += (pyramid[i + 1][j] > pyramid[i + 1][j + 1] ? pyramid[i + 1][j] : pyramid[i + 1][j + 1]))。

4. 循环结束后,金字塔顶部的值即为从顶部到底部的最大路径和。

5. 返回金字塔顶部的值。
 

http://www.lryc.cn/news/341748.html

相关文章:

  • 启动 Redis 服务和连接到 Redis 服务器
  • 我独自升级崛起在哪下载 我独自升级电脑PC端下载教程分享
  • STM32F4xx开发学习—GPIO
  • 引领农业新质生产力,鸿道(Intewell®)操作系统助力农业机器人创新发展
  • 扩展学习|一文读懂知识图谱
  • ubuntu中的docker记录(3)——如何安装nvidia-docker以更好地支持GPU加速计算应用程序的运行
  • MLP实现fashion_mnist数据集分类(1)-模型构建、训练、保存与加载(tensorflow)
  • ChatGPT-税收支持新质生产力
  • Linux下深度学习虚拟环境的搭建与模型训练
  • Map-Reduce是个什么东东?
  • 上位机工作感想-从C#到Qt的转变-2
  • 【C++】C++ 中 的 lambda 表达式(匿名函数)
  • OpenSSL实现AES-CBC加解密,可一次性加解密任意长度的明文字符串或字节流(QT C++环境)
  • cURL:命令行下的网络工具
  • Baumer工业相机堡盟工业相机如何通过NEOAPISDK查询和轮询相机设备事件函数(C#)
  • Day45代码随想录动态规划part07:70. 爬楼梯(进阶版)、322. 零钱兑换、279.完全平方数、139.单词拆分
  • 土壤重金属含量分布、Cd镉含量、Cr、Pb、Cu、Zn、As和Hg、土壤采样点、土壤类型分布
  • 力扣:100284. 有效单词(Java)
  • 如何快速掌握DDT数据驱动测试?
  • OpenCV如何实现背投(58)
  • 5-在Linux上部署各类软件
  • 【Jenkins】持续集成与交付 (八):Jenkins凭证管理(实现使用 SSH 、HTTP克隆Gitlab代码)
  • 开源模型应用落地-CodeQwen模型小试-SQL专家测试(二)
  • Arch Linux安装macOS
  • 接口自动化框架篇:Pytest + Allure报告企业定制化实现!
  • 保持 Hiti 证卡打印机清洁的重要性和推荐的清洁用品
  • Unity C#的底层原理概述
  • 国产数据库的发展势不可挡
  • 权益商城系统源码 现支持多种支付方式
  • python安装问题及解决办法(pip不是内部或外部命令也不是可运行)