首页/新闻资讯/正文详情

动态规划解数字金字塔与稀疏矩阵优化存储

发布时间:2026/11/4 20:41:02 来源:云帆数科 栏目:资讯中心
动态规划解数字金字塔与稀疏矩阵优化存储
1. 数字金字塔问题的动态规划解法数字金字塔问题是一个经典的动态规划入门题目。给定一个由数字组成的金字塔结构要求从顶部到底部找到一条路径使得路径上的数字之和最大。每次只能移动到正下方或右下方的相邻位置。1.1 问题分析与解决思路这个问题最直观的解法是使用递归穷举所有可能的路径但这种方法的时间复杂度是指数级的O(2^n)对于较大的金字塔效率极低。动态规划提供了一种更高效的解决方案。核心思想是从金字塔底部向上递推计算。对于金字塔中的每个位置我们计算从该位置到底部的最大路径和并将这个值存储在当前位置。这样顶部的值最终就是整个金字塔的最大路径和。1.2 具体实现步骤数据存储使用二维数组tr[MAX][MAX]存储金字塔结构其中tr[i][j]表示第i行第j列的数字。递推计算从倒数第二行开始向上遍历对于每个位置tr[i][j]计算其正下方tr[i1][j]和右下方tr[i1][j1]中的较大值将这个较大值加到tr[i][j]上更新当前位置的值结果输出最终tr[0][0]就是整个金字塔的最大路径和。1.3 代码实现与优化#includestdio.h #define MAX 100 int main() { int R; int tr[MAX][MAX] {0}; // 读取数据 scanf(%d, R); for (int i 0; i R; i) { for (int j 0; j i; j) { scanf(%d, tr[i][j]); } } // 从倒数第二行开始往上计算 for (int i R - 2; i 0; i--) { for (int j 0; j i; j) { // 取正下方和右下方中较大的一个加上当前值 int down tr[i 1][j]; int right tr[i 1][j 1]; if (down right) { tr[i][j] down; } else { tr[i][j] right; } } } // 顶部就是最大路径和 printf(%d\n, tr[0][0]); return 0; }1.4 时间复杂度分析这种方法的时间复杂度是O(n^2)其中n是金字塔的行数。因为我们需要遍历金字塔中的每个元素一次进行常数时间的比较和加法操作。1.5 实际应用与扩展这种自底向上的动态规划方法不仅适用于数字金字塔问题还可以应用于其他类似的最优化路径问题如网格路径问题、最短路径问题等。理解这个问题的解法有助于掌握动态规划的基本思想。2. 稀疏矩阵的压缩存储稀疏矩阵是指大部分元素为零的矩阵。对于这类矩阵传统的二维数组存储方式会浪费大量空间存储零值。因此我们需要一种更高效的存储方式。2.1 稀疏矩阵的表示方法常见的稀疏矩阵表示方法有三种三元组表示法存储非零元素的行号、列号和值十字链表表示法更复杂的链表结构适合频繁修改的稀疏矩阵行偏移表示法记录每行非零元素的起始位置2.2 三元组表示法的实现#include stdio.h int main(){ int m, n; while(scanf(%d %d, m, n) ! EOF){ int arr[m][n]; for(int i 0; i m; i){ for(int j 0; j n; j) scanf(%d, arr[i][j]); } for(int i 0; i m; i){ for(int j 0; j n; j){ if(arr[i][j] ! 0) printf(%d %d %d\n, i 1, j 1, arr[i][j]); } } printf(\n); } return 0; }2.3 算法分析输入处理读取矩阵的行数m和列数n矩阵存储使用二维数组存储输入的矩阵非零元素输出遍历矩阵输出每个非零元素的行号、列号和值注意行号和列号从1开始计数2.4 性能优化对于特别大的稀疏矩阵可以考虑以下优化按行存储先按行号排序可以减少输出时的随机访问批量处理积累一定数量的非零元素后批量输出减少I/O操作并行处理对于非常大的矩阵可以分块并行处理3. 矩阵转置算法矩阵转置是将矩阵的行列互换的操作即原矩阵的第i行第j列元素变为转置矩阵的第j行第i列元素。3.1 基本转置算法#includestdio.h int main(){ int m; while(scanf(%d,m)!EOF){ int arr[100][100]{0}; for(int i0;im;i){ for(int j0;jm;j){ scanf(%d,arr[i][j]); } } for(int i0;im;i){ for(int j0;ji;j){ int temparr[i][j]; arr[i][j]arr[j][i]; arr[j][i]temp; } } for(int i0;im;i){ for(int j0;jm;j){ printf(%d,arr[i][j]); if(jm-1) printf( ); } printf(\n); } printf(\n); } return 0; }3.2 算法分析输入处理读取矩阵的大小m和矩阵元素转置操作只遍历矩阵的下三角部分包括对角线交换arr[i][j]和arr[j][i]输出处理注意每行最后一个数字后不输出空格3.3 优化策略原地转置对于方阵可以在原矩阵上直接交换元素不需要额外空间分块转置对于大矩阵可以采用分块策略提高缓存命中率并行转置对于非常大的矩阵可以并行处理不同的矩阵块3.4 应用场景矩阵转置在科学计算、图像处理等领域有广泛应用特别是在矩阵乘法、特征值计算等算法中。4. 魔方阵的构造算法魔方阵是一种n×n的方阵其中填入1到n²的自然数使得每行、每列及两条对角线上的数字之和都相等。4.1 奇数阶魔方阵的构造规则将1放在第一行中间列后续数字放在前一个数字的右上方行减1列加1如果行超出范围则移到最下面一行如果列超出范围则移到最左边一列如果目标位置已有数字或前一个数字在第一行最后一列则放在前一个数字的正下方4.2 算法实现#includestdio.h int main(){ int n; while(scanf(%d,n)!EOF){ int arr[20][20]{0}; //初始化数组全部为0 for(int a0;an;a){ for(int b0;bn;b){ arr[a][b]0; } } //规则1将1放在第一行中间一列 int i0,jn/2; arr[i][j]1; //记录上一个数的位置 int pre_i0; int pre_jn/2; //从2开始填充到n*n for(int k2;kn*n;k){ //规则2下一个数放在上一个数的右上方 ipre_i-1; jpre_j1; //规则3如果行0,则放到最下面一行 if(i0) in-1; //规则4如果列n,则放到最左一列 if(jn) j0; //规则5如果位置已经被占用或者上一个数在右上角(0,n-1) if(arr[i][j]!0||(pre_i0pre_jn-1)){ //则放在上一个数的正下方行1列 ipre_i1; jpre_j; //处理下方越界的情况 if(in) i0; } arr[i][j]k; //更新上一个数的位置 pre_ii; pre_jj; } //输出魔方阵 for(int a0;an;a){ for(int b0;bn;b){ printf(%d,arr[a][b]); if(bn-1) printf( ); else printf(\n); } } printf(\n); } return 0; }4.3 算法分析初始化创建n×n的二维数组并初始化为0放置第一个数字将1放在第一行中间列填充剩余数字按照5条规则依次放置2到n²的数字边界处理处理行列越界的情况冲突解决当目标位置已有数字时放在前一个数字的正下方4.4 数学性质魔方阵的魔数每行、列、对角线的和可以通过公式计算 魔数 n(n²1)/2例如3阶魔方阵的魔数为155阶为65。5. 最大效益问题的排列解法最大效益问题是一个典型的指派问题需要在n×n的效益表中选出n个数字使得这些数字来自不同的行和列且它们的和最大。5.1 问题分析这个问题可以转化为在效益矩阵中找到一组行和列的排列使得对应位置的数字之和最大。对于5×5的矩阵共有5! 120种可能的排列组合。5.2 排列枚举法使用C标准库中的next_permutation函数可以方便地生成所有可能的排列组合。#include bits/stdc.h using namespace std; int main() { ios::sync_with_stdio(0); cin.tie(0); int a[5][5]; while (cin a[0][0]) { // 输入矩阵 for (int i 0; i 5; i) { for (int j 0; j 5; j) { if (i 0 j 0) { // 第一个数字已经输入过了跳过 continue; } cin a[i][j]; } } // 计算每种情况 int cols[] {0,1,2,3,4}; int s 0; do { int sum 0; for (int i 0; i 5; i) { sum a[i][cols[i]]; } s max(s,sum); } while (next_permutation(cols,cols5)); cout s \n; } return 0; }5.3 算法分析输入处理读取5×5的效益矩阵排列生成使用next_permutation生成列索引的所有排列效益计算对于每种排列计算对应位置的数字之和最大值更新保留最大的效益值5.4 优化策略对于更大的矩阵n10排列枚举法会变得不切实际。可以考虑以下优化方法匈牙利算法专门解决指派问题的多项式时间算法分支限界法通过剪枝减少搜索空间贪心算法虽然不能保证最优解但在某些情况下可以提供不错的近似解5.5 实际应用这类问题在实际中有广泛应用如任务分配将任务分配给最合适的人员资源调度将资源分配给最能发挥其效用的项目路径规划选择最优的运输路线组合

相关推荐

人形机器人技术突破与商业化挑战分析
人形机器人技术突破与商业化挑战分析

1. 人形机器人行业动态速览 最近一周人形机器人领域发生了三件标志性事件:伦敦街头测试的机器人意外翻车、斯坦福大学突破性跑酷算法、以及首形科技娱乐机器人Elf-Xuan的爆红。这三个看似独立的事件,恰好反映了当前行业发展的三个关键方向——商业化落地… · 2026/11/4 20:39:56

Flask+sqlite3实战:从零搭建一个可扩展的Web小项目
Flask+sqlite3实战:从零搭建一个可扩展的Web小项目

简介:这份资源是一个基于 Python Flask 的轻量级 Web 开发练习项目,面向刚接触 Web 框架的初学者与需要动手巩固基础的开发者,围绕一个简易博文系统展开,涵盖用户登录登出、博文发布与浏览等核心功能,帮助读者理解从路… · 2026/11/4 20:39:56

VibeVoice:连续语音Tokenizer与Next-Token扩散实现90分钟长音频合成
VibeVoice:连续语音Tokenizer与Next-Token扩散实现90分钟长音频合成

从Hugging Face刷到VibeVoice这个开源项目时,我第一反应是又有人拿“长上下文”当噱头。但看完它的技术组成——“连续语音Tokenizer”“Next-Token扩散”,再看到“90分钟多说话人语音合成”“60分钟长音频识别”这两组实测数据,我决定把它拉… · 2026/11/4 20:39:56

Sue E. Goodman. Beginning Topology
Sue E. Goodman. Beginning Topology

Sue E. Goodman所著的《Beginning Topology》是美国数学学会(AMS)2005年出版的本科拓扑学入门教材,属于《Pure and Applied Undergraduate Texts》丛书第10卷,ISBN为978-0-8218-4796-1 。 📚 教材核心定位 面向本科阶… · 2026/11/4 23:00:03

Noga Alon and Joel H. Spencer, The Probabilistic Method
Noga Alon and Joel H. Spencer, The Probabilistic Method

Noga Alon与Joel H. Spencer合著的《The Probabilistic Method》是组合数学领域的里程碑式经典教材,1991年首次出版,2016年推出第4版,是概率方法这一核心数学工具的公认权威参考书,被全球数百所高校的组合数学、理论计算机科学研究… · 2026/11/4 23:00:03

年底还在招的岗位,先确认缺口和到岗要求
年底还在招的岗位,先确认缺口和到岗要求

十一月看到一个技术岗位,不要仅凭「年底还在招」判断机会好坏。先确认缺口是否明确、流程由谁推进、希望何时到岗。岗位发布时间只能说明页面上有这条信息,不能替你回答团队现在需要什么人。 准备跳槽的人往往同时安排项目收尾、面试和个人行程。如果岗位… · 2026/11/4 22:58:59

gstreamer pipeline梳理及插件新增方案
gstreamer pipeline梳理及插件新增方案

一,整体播放的pipeline 1,playbin 主要做两件事情: 收到 uridecodebin 的 raw pad(pad-added)→ 接入 input-selector 的 sink_%u(pad_added_cb) 收到 uridecodebin 的 no-more-pads → request playsink p… · 2026/11/4 22:57:56

C语言通讯录系统:从入门到工程实践的完整图谱
C语言通讯录系统:从入门到工程实践的完整图谱

这个通讯录管理系统, 使用C语言进行开发, 是一个典型的综合性实践项目。它不仅仅涵盖了C语言的核心语法和编程范式, 而且深入融合了数据结构、内存管理、文件系统操作以及软件工程的基本思想。所以, 它是初学者迈向中级C程序员的重要桥梁。这个项目利用了一个叫作通讯录的东西,… · 2026/11/4 22:57:56

不用大模型也能抽 JSON?这个 287M 的小模型跑在 CPU 上,成绩只差 GPT-4o 不到 1 分
不用大模型也能抽 JSON?这个 287M 的小模型跑在 CPU 上,成绩只差 GPT-4o 不到 1 分

不用大模型也能抽 JSON?这个 287M 的小模型跑在 CPU 上,成绩只差 GPT-4o 不到 1 分 【免费下载链接】gliner2.5-multi-v1 项目地址: https://ai.gitcode.com/hf_mirrors/fastino/gliner2.5-multi-v1 先问你一个很现实的问题。 公司要你把几百份… · 2026/11/4 22:56:55

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码