三维动态规划-LeetCode3418. 机器人可以获得的最大金币数

太爽了!做完这道题,让我感觉就像是斩杀了一条大龙!历时72天,分3次花掉30小时。终获突破!

零、题目

3418. 机器人可以获得的最大金币数

给你一个 m x n 的网格。一个机器人从网格的左上角 (0, 0) 出发,目标是到达网格的右下角 (m - 1, n - 1)。在任意时刻,机器人只能向右或向下移动。

网格中的每个单元格包含一个值 coins[i][j]

  • 如果 coins[i][j] >= 0,机器人可以获得该单元格的金币。
  • 如果 coins[i][j] < 0,机器人会遇到一个强盗,强盗会抢走该单元格数值的 绝对值 的金币。

机器人有一项特殊能力,可以在行程中 最多感化 2个单元格的强盗,从而防止这些单元格的金币被抢走。

注意:机器人的总金币数可以是负数。

返回机器人在路径上可以获得的 最大金币数 

一、思路诞生

最开始没有思路。对于动态规划做了很多题。

动态规划现在总结为五大步:

0.从(0,0)之类的挪到(1,1)方便使用

1.确定能影响结果的自变量

2.定义一个dp,当然可以是多元函数。C语言支持多维数组。

给出dp[i][j]的含义。用中文

3.写出状态转移方程。根据最后一个,通常是最后一个,或者右下角

4.求解结果:取出最后一个(或者最后一叠)中的最值。

二、本题思路

由于读完题后,发现这里有几个关键的自变量。

一个是二维数组的坐标(m,n)

另一个是使用感化的次数k

由于金币相当于是已知信息,并且这个信息不受其他信息的影响是绝对不变的。

而要求解问题时,某个具体坐标的具体感化次数都是会受到影响的。

倘若没有感化次数,也就是每资格感化,绝对不变,也就是不受其他信息的影响,那就没必要使用动态规划函数里面的一个变量。

于是就开始写状态转移方程

dp(m,n,k)表示从(1,1)到(m,n)恰好使用k次感化所能获得的最大金币数。(到4.得到结果那里发现这个定义不够准确,但是状态转移方程那里倒是对了)

当然也可以用别的方式定义,但是状态方程会变化。这种我自己觉得比价好想。

而后就是从k=0开始考量,一点一点考量。k=1开始考量。一点一点的。

最后想出了状态转移方程的全部(见草稿纸)

然后中间有一点卡住了,就是一直在想这一格是感化还是不感化呢。后来看了题干,恍然大悟,大于等于0的时候,根本不能感悟。只有小于0的时候才能感悟。于是,就应该根据这个格子金币是否小于0做出判断。

 

三、开始写代码

分为四部分:数据读入并迁移、数据初始化、状态转移、得到结果

1.数据读入并迁移

力扣里面int maximumAmount(int** coins, int coinsSize, int* coinsColSize)的含义就是

数组,行长度(有多少行),列长度(有多少列)

int extGrid[600][600];int i, j, k;int m = coinsSize; int n = *coinsColSize;for (i = 0; i < m; i++) {for (j = 0; j < n; j++) {extGrid[i + 1][j + 1] = coins[i][j];//printf("%d ",coins[i][j]);}}for (i = 1; i <= m; i++) {for (j = 1; j <= n; j++) {printf("%d ", extGrid[i][j]);}puts("");}

这样就可以完成迁移并打印检查了。

2.数据初始化

数据初始化就是考虑第0行和第0列。这是一个常规操作。但是由于这里金币范围是[-1000,1000]设置一个负无穷什么的就可以。但是我这里做了一小点创新。就是我使用了一种自定义的最大值获取,我称为Emax,存在最大值existMax。因为状态转移方程里面,会看到如果这种情况不存在的话,那就不用考虑。而最后放入dp格子中时,肯定要加入extGrid[i][j],那么这些不存在的情况其实就是0.所以来看一下Emax的实现

int isAlive(int mem[3]) {int r = mem[0];int q = mem[1];if (r == 0) {return 0;}if (q == 0) {return 0;}return 1;
}
int getNum(int mem[3]) {int r = mem[0];int q = mem[1];int s = mem[2];return dp[r][q][s];
}
int Emax(int mem1[3], int mem2[3]) {int ali1 = isAlive(mem1);int ali2 = isAlive(mem2);if (!ali1&&!ali2) {return 0;//都不存在,该值为0}if (!ali1 && ali2) {return getNum(mem2);}if (ali1 && !ali2) {return getNum(mem1);}//都存在,返回较大的return fmax(getNum(mem1), getNum(mem2));
}

3.状态转移

这一步的关键就是准确列出所有情况。分类讨论。

这里有两点创新。

一个是因为每次写dp[i][j][k]挺累的,不妨弄一个member成员,用来方便书写。每次只要传member就可以了。另外就是可以看到先用Emax取存在的结果,再用Emax得到的结果使用库函数fmax取最大值得到结果。

for (i = 1; i <= m; i++) {for (j = 1; j <= n; j++) {if (extGrid[i][j] >= 0) {for (k = 0; k <= 2; k++) {int mem1[3] = { i - 1,j,k };int mem2[3] = { i,j - 1,k };dp[i][j][k] = Emax(mem1, mem2)+extGrid[i][j];}}else {//dp(m,n,0)k = 0;int mem1[3] = { i - 1,j,k };int mem2[3] = { i,j - 1,k };dp[i][j][k] = Emax(mem1, mem2) + extGrid[i][j];//dp(m,n,1)k = 1;int bmem1[3] = { i - 1,j,k };int bmem2[3] = { i,j - 1,k };k = 0;int bmem3[3] = { i - 1,j,k };int bmem4[3] = { i,j - 1,k };int t1= Emax(bmem1, bmem2) + extGrid[i][j];int t2 = Emax(bmem3, bmem4);k = 1;dp[i][j][k] = fmax(t1,t2) ;//dp(m,n,2)k = 2;int cmem1[3] = { i - 1,j,k };int cmem2[3] = { i,j - 1,k };k = 1;int cmem3[3] = { i - 1,j,k };int cmem4[3] = { i,j - 1,k };t1 = Emax(cmem1, cmem2) + extGrid[i][j];t2 = Emax(cmem3, cmem4);k = 2;dp[i][j][k] = fmax(t1, t2);}}}

4.得到结果

这里就只需要取最后的位置,摘取胜利果实就可以了。

return fmax(fmax(dp[m][n][0], dp[m][n][1]), dp[m][n][2]);

不过,需要注意的是,感化次数为2,自然一定比恰使用感化次数为1的金币数多。因为多一次机会。不过是否每次都能有2次感化的机会呢?需要得有2个负数才可以。否则2次感化就是抄的之前的结果。如果之前一直为0的话。那就出故障了。所以还是应该fmax最好。不过巧了。这里没有影响。因为实际上我们实现的代码dp的含义是,感化次数最多为k的时候,所能得到的最大金币数量。这样状态转移方程才合理。

四、提交改BUG

0.本地vs2022调试失败

出现栈溢出错误。上网学习,发现改一下就好了。

dp[600][600][3]这是数组,肯定是在栈上的。

如果用malloc,就会在堆上,但是会很麻烦。

感谢下面的博客教我计算。格子里的数字单位是字节。差不多10MB的内存能跑起来,100MB或者200MB肯定就够用了

VS运行时报错:未经处理的异常-CSDN博客​​​​​​​

修好啦!

1.小于等于号漏等于

分类讨论那里。就需要注意不能只是小于。只小于最后的结果,就是输出的k=0,k=1全部都是0.用调试,调了一下感觉没那么方便但是有一些一调试就是一下就能看出来。其实还是看调试那里,感觉监视窗口里面i,j,k的值不变,就哪里有问题哪里打断点,比较快地解决了。

2.在372个测试样例时出现了超时

一交,对了300多个。我很激动。说明算法对了。哪里还需要小小优化一下。

一种是算法不是最快的,但是我这O(N^2)已经最快了。不是这个原因

另一种是差个系数。我觉得是这个。

①首先调整了isAlive代码尝试变快

收效甚微

②其次问chatGLM智谱清言

告诉我了这个。我觉得ptintf这个I/O输出很有道理(下图第4条),就试了一下。

结果没想到从790ms一下子变成了27ms,快了将近30倍。我的妈呀。

这个一改。就过了。

五、完整代码

通关截图:

#include <stdio.h>
#include <malloc.h>
#include <math.h>
int dp[600][600][3];//0,1,2表示感化次数
int isAlive(int mem[3]) {int r = mem[0];int q = mem[1];if (r == 0) {return 0;}if (q == 0) {return 0;}return 1;
}
int getNum(int mem[3]) {int r = mem[0];int q = mem[1];int s = mem[2];return dp[r][q][s];
}
int Emax(int mem1[3], int mem2[3]) {int ali1 = isAlive(mem1);int ali2 = isAlive(mem2);if (!ali1&&!ali2) {return 0;//都不存在,该值为0}if (!ali1 && ali2) {return getNum(mem2);}if (ali1 && !ali2) {return getNum(mem1);}//都存在,返回较大的return fmax(getNum(mem1), getNum(mem2));}
int maximumAmount(int** coins, int coinsSize, int* coinsColSize) {int extGrid[600][600];int i, j, k;int m = coinsSize; int n = *coinsColSize;for (i = 0; i < m; i++) {for (j = 0; j < n; j++) {extGrid[i + 1][j + 1] = coins[i][j];//printf("%d ",coins[i][j]);}}for (i = 1; i <= m; i++) {for (j = 1; j <= n; j++) {printf("%d ", extGrid[i][j]);}puts("");}for (i = 1; i <= m; i++) {for (j = 1; j <= n; j++) {if (extGrid[i][j] >= 0) {for (k = 0; k <= 2; k++) {int mem1[3] = { i - 1,j,k };int mem2[3] = { i,j - 1,k };dp[i][j][k] = Emax(mem1, mem2)+extGrid[i][j];}}else {//dp(m,n,0)k = 0;int mem1[3] = { i - 1,j,k };int mem2[3] = { i,j - 1,k };dp[i][j][k] = Emax(mem1, mem2) + extGrid[i][j];//dp(m,n,1)k = 1;int bmem1[3] = { i - 1,j,k };int bmem2[3] = { i,j - 1,k };k = 0;int bmem3[3] = { i - 1,j,k };int bmem4[3] = { i,j - 1,k };int t1= Emax(bmem1, bmem2) + extGrid[i][j];int t2 = Emax(bmem3, bmem4);k = 1;dp[i][j][k] = fmax(t1,t2) ;//dp(m,n,2)k = 2;int cmem1[3] = { i - 1,j,k };int cmem2[3] = { i,j - 1,k };k = 1;int cmem3[3] = { i - 1,j,k };int cmem4[3] = { i,j - 1,k };t1 = Emax(cmem1, cmem2) + extGrid[i][j];t2 = Emax(cmem3, cmem4);k = 2;dp[i][j][k] = fmax(t1, t2);}}}for (k = 0; k <= 2; k++) {printf("k is %d\n", k);for (i = 1; i <= m; i++) {for (j = 1; j <= n; j++) {//printf("dp[%d][%d][%d]=%d\n", i, j, k, dp[i][j][k]);printf("%d ", dp[i][j][k]);}puts("");}}return fmax(fmax(dp[m][n][2], dp[m][n][1]), dp[m][n][2]);
}
int main() {int* arr1 = (int*)malloc(sizeof(int) * 3);int *arr2= (int*)malloc(sizeof(int) * 3);int* arr3 = (int*)malloc(sizeof(int) * 3);int coins2 [3][3] = {{0, 1, -1},{1, -2, 3},{2, -3, 4}};int** coins = (int**)malloc(sizeof(int*) * 3);coins[0] = arr1; coins[1] = arr2; coins[2] = arr3;int i, j;for (i = 0; i < 3; i++) {for (j = 0; j < 3; j++) {coins[i][j] = coins2[i][j];}}int col = 3;int ans = maximumAmount(coins,3,&col);printf("\nans is %d\n", ans);return 0;
}

补负一、失败的思路

因为代码太复杂,写初始化卡死了。初始化想不通。

失败的代码。从失败中获得了启发。想到了Emax函数
typedef struct Square{int a0;int a1;int a2;int negativeMostMax;int negativeSecondMax;int money;
}sq;
int fmaxnum(int a, int b){if(a==b){return 3;}if(a>b){return 1;}return 2;
}
void changeNegative(sq lastSq,sq * square){int min1=lastSq.negativeMostMax;int min2=lastSq.negativeSecondMax;int m=square->money;if(m<min1){min2=min1;min1=m;}else if(m<min2){min2=m;}square->negativeMostMax=min1;square->negativeSecondMax=min2;
}
void showSquareArr(sq sqArr[600][600],int m,int n){puts("");puts("k=0");int i,j;for(i=0;i<=m;i++){for(j=0;j<=n;j++){printf("%d ",sqArr[i][j].a0);}puts("");}puts("");puts("");puts("negativeMostMax");for(i=0;i<=m;i++){for(j=0;j<=n;j++){printf("%d ",sqArr[i][j].negativeMostMax);}puts("");}puts("");puts("");puts("negativeSecondMax");for(i=0;i<=m;i++){for(j=0;j<=n;j++){printf("%d ",sqArr[i][j].negativeSecondMax);}puts("");}puts("");// puts("");// puts("k=1");// for(i=0;i<=m;i++){//     for(j=0;j<=n;j++){//         printf("%d ",sqArr[i][j].a1);//     }//     puts("");// }// puts("");// puts("");// puts("k=2");// for(i=0;i<=m;i++){//     for(j=0;j<=n;j++){//         printf("%d ",sqArr[i][j].a2);//     }//     puts("");// }// puts("");// puts("");// puts("moneyGrid");// for(i=0;i<=m;i++){//     for(j=0;j<=n;j++){//         printf("%d ",sqArr[i][j].money);//     }//     puts("");// }// puts("");}int maximumAmount(int** coins, int coinsSize, int* coinsColSize) {int i,j;int i_,j_;sq extGrid[600][600]={9};//11:10开始思考//11:20有思路,开始验证//11:20-11:40更新思路,开始码代码//13;13 了解leetcode规则//1413开始码字int m=coinsSize;int n=*coinsColSize;//showSquareArr(extGrid,m,n);//矩阵拓展.存储moneyfor(i=0,i_=1;i<m;i++,i_++){for(j=0,j_=1;j<n;j++,j_++){extGrid[i_][j_].money=coins[i][j];}}//showSquareArr(extGrid,m,n);//进行矩阵初始化。(k=0)extGrid[1][1].a0=extGrid[1][1].money;//初始化第一列j=1;for(i=2;i<=m;i++){extGrid[i][j].a0=extGrid[i-1][j].a0+extGrid[i][j].money;}//初始化第一行i=1;for(j=2;j<=n;j++){extGrid[i][j].a0=extGrid[i][j-1].a0+extGrid[i][j].money;}//状态转移for(i=2;i<=m;i++){for(j=2;j<=n;j++){extGrid[i][j].a0=fmax(extGrid[i][j-1].a0,extGrid[i-1][j].a0)+extGrid[i][j].money;}}//进行矩阵初始化。(最小值的建立)extGrid[1][1].negativeMostMax=extGrid[1][1].money;//注意第一行第一列只有一个有效值。第一行第二列有2个有效值int mt;mt=extGrid[1][2].money;if(mt<extGrid[1][1].negativeMostMax){extGrid[1][2].negativeSecondMax=extGrid[1][1].negativeMostMax;extGrid[1][2].negativeMostMax=mt;}else{extGrid[1][2].negativeMostMax=extGrid[1][1].negativeMostMax;extGrid[1][2].negativeSecondMax=mt;}//初始化第一行.j从3开始i=1;for(j=3;j<=n;j++){changeNegative(extGrid[i][j-1],&extGrid[i][j]);}//注意第一行第一列只有一个有效值。第二行第一列有2个有效值mt=extGrid[2][1].money;if(mt<extGrid[1][1].negativeMostMax){extGrid[2][1].negativeSecondMax=extGrid[1][1].negativeMostMax;extGrid[2][1].negativeMostMax=mt;}else{extGrid[2][1].negativeMostMax=extGrid[1][1].negativeMostMax;extGrid[2][1].negativeSecondMax=mt;}//初始化第一列.i从3开始j=1;for(i=3;i<=m;i++){changeNegative(extGrid[i-1][j],&extGrid[i][j]);}//状态转移for(i=2;i<=m;i++){for(j=2;j<=n;j++){int num=fmaxnum(extGrid[i][j-1].a0,extGrid[i-1][j].a0);extGrid[i][j].a0=fmax(extGrid[i][j-1].a0,extGrid[i-1][j].a0)+extGrid[i][j].money;}}showSquareArr(extGrid,m,n);return 0;
}

 

感谢大家的观看和喜欢!祝读者朋友们也屠龙痛快!

 

 

 

 

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

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

相关文章

相生、相克、乘侮、复杂病机及对应的脏腑功能联系

一、五行相生关系&#xff08;母子关系&#xff09; 五行生序脏腑关系生理表现举例木生火肝&#xff08;木&#xff09;滋养心&#xff08;火&#xff09;肝血充足则心血旺盛火生土心&#xff08;火&#xff09;温煦脾&#xff08;土&#xff09;心阳充足则脾胃运化功能正常土…

Ubuntu22.04搭建freeradius操作说明

Ubuntu22.04搭建freeradius操作说明 更新依赖库 sudo apt update sudo apt install build-essential sudo apt install libtalloc-dev sudo apt install libssl-dev 按照freeradius sudo apt install freeradius 修改freeradius配置 文件路径如下 /etc/freeradius/3.…

es中安装ik分词器

在线安装ik插件&#xff08;较慢&#xff09; docker exec -it es /bin/bash ./bin/es-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip 看到报错了&#xff0c;我访问一下。就是没有了…

最大字段和问题 C++(穷举、分治法、动态规划)

问题描述 给定由n个整数&#xff08;包含负整数&#xff09;组成的序列a1,a2,…,an&#xff0c;求该序列子段和的最大值。规定当所有整数均为负值时定义其最大子段和为0 穷举法 最简单的方法就是穷举法&#xff0c;用一个变量指示求和的开始位置&#xff0c;一个变量指示结束…

如何理解三极管截至区、放大区、饱和区

一、 三极管符号&#xff1a; NPN : PNP: 二、Vce、与Ic曲线图 1、截至区&#xff1a;ib很小的时候就是截至区。因为Ib很小的时候等价于Ub很小&#xff0c;Ub如果不足以达到0.7V PN结就不会导通&#xff0c;所以三极管就…

电脑上我的windows目录下,什么是可以删除的

在Windows系统目录&#xff08;通常是C:\Windows&#xff09;中&#xff0c;大部分文件和文件夹都是系统运行所必需的&#xff0c;随意删除可能导致系统崩溃或程序无法运行。不过&#xff0c;部分文件可以安全清理。以下是详细指南&#xff1a; 可安全清理的内容 临时文件&…

工作中遇到的spark SQL小问题:包含某个或某些字符的条件

今天又来总结工作中遇到的问题了&#xff0c;今天是SQL&#xff0c;spark引擎 需求描述&#xff0c;筛选渠道包含”线上化“的数据 也就是讨论where里面的这个筛选条件怎么写 一般起手都是 where QD like %线上化%‘ 学习了其他的写法: 1.INSTR函数 where INSTR(QD,&quo…

Git 命令操作完全指南

Git 是现代软件开发中不可或缺的分布式版本控制系统。它不仅能追踪代码变更&#xff0c;还能协调多人协作、管理项目历史。本文从核心概念入手&#xff0c;逐步深入讲解 Git 的基础与高级命令&#xff0c;结合实用场景&#xff0c;帮助您从入门到精通。 一、Git 核心概念 理解…

深入剖析带头循环双向链表的实现与应用

引言 场景描述 想象一个 环形地铁线路&#xff08;如深圳地铁11号线&#xff09;&#xff0c;这条线路首尾相连&#xff0c;列车可以顺时针或逆时针循环行驶。为了方便管理&#xff0c;地铁系统设置了一个 “虚拟调度中心”&#xff08;头节点&#xff09;&#xff0c;它不承…

DeepSeek Smallpond 在火山引擎 AI 数据湖的探索实践

资料来源&#xff1a;火山引擎-开发者社区 DeepSeek Smallpond 介绍 Smallpond 是一套由 DeepSeek 推出的 、针对 AI 领域&#xff0c;基于 Ray 和 DuckDB 实现的轻量级数据处理引擎&#xff0c;具有以下优点&#xff1a; 1.轻量级 2.高性能 3.支持规模大 4.无需运维 5.P…

Linux进程间的通信

进程间通信 1.进程间通信介绍2.匿名命名管道原理操作 1.进程间通信介绍 1.1 进程间通信目的&#xff1a;一个进程需要将他的数据发送给另一个进程&#xff0c;大家应该都多少接触过linux中的管道符"|"&#xff0c;这个符号就是用来多个命令执行&#xff0c;在Linux中…

直播预告 | TDgpt 智能体发布 时序数据库 TDengine 3.3.6 发布会即将开启

从海量监控数据&#xff0c;到工业、能源、交通等场景中实时更新的各类传感器数据&#xff0c;时序数据正在以指数级速度增长。而面对如此庞杂的数据&#xff0c;如何快速分析、自动发现问题、精准预测未来&#xff0c;成为企业数字化转型过程中的关键挑战。 TDengine 的答案是…

手撕FIO工具指南:从压测翻车到避坑实战

文章目录 手撕FIO工具指南&#xff1a;从压测翻车到避坑实战一、背景&#xff1a;一次FIO压测引发的惊魂夜二、FIO vs 其他IO工具&#xff1a;为何让人又爱又怕&#xff1f;三、安装指南&#xff1a;避开依赖地狱四、参数详解五、避坑指南&#xff1a;血泪经验总结六、安全压测…

智能汽车图像及视频处理方案,支持视频星轨拍摄能力

美摄科技作为智能汽车图像及视频处理领域的先行者&#xff0c;正以革新性的技术引领着行业的未来发展。美摄科技智能汽车图像及视频处理方案&#xff0c;一个集高效性、智能化、画质增强于一体的创新解决方案&#xff0c;旨在重塑智能汽车图像画质的新标准&#xff0c;并支持前…

B站左神算法课学习笔记(P7):图

目录 一、图的存储方式&#xff08;千奇百怪&#xff09; 1&#xff09;邻接表 2&#xff09;邻接矩阵 3&#xff09;其他 4&#xff09;推荐存储方式&#xff08;代码&#xff09; 二、图的遍历 &#xff08;1&#xff09;宽度优先遍历 &#xff08;2&#xff09;深度…

深度解析「前缀和」与「差分法」:高效算法的基石

深度解析前缀和与差分法&#xff1a;高效算法的基石 在计算机科学和数据处理领域&#xff0c;前缀和&#xff08;Prefix Sum&#xff09;与差分法&#xff08;Difference Method&#xff09;是两种基础且高效的算法技术。它们在处理数组的区间查询和区间修改操作时&#xff0c…

2-1 基本放大电路

放大的概念 mV →V mA→A 特征&#xff1a;放大功率&#xff08;电压与电流&#xff09;。 本质&#xff1a;能量在控制下的转换。&#xff08;外接供电电源&#xff09; 必要条件&#xff1a;有源元件&#xff08;能量控制原件&#xff09; 前提&#xff1a;不失真 测试的…

详解接口的常见请求方式

详解接口的常见请求方式 一、 常见接口请求方式1. GET2. POST3. PUT4. DELETE5. PATCH6. HEAD7. OPTIONS 二、 实现方法1. 前端实现2. 后端实现 三、 作用与主要区别四、 举例讲解1. 创建 Spring Boot 工程2. 添加依赖3. 编写 Controller 实现接口关键点说明 4. 启动与测试5. 总…

【附代码】【MILP建模】3D装箱问题(3D-Bin Packing Problem)

文章目录 相关教程相关文献问题描述建模思路——carton 方向平行轴建模方法&#xff08;9变量6约束&#xff09;平行轴建模方法&#xff08;4变量8约束&#xff09;枚举建模方法&#xff08;6变量1约束&#xff09; 建模思路——carton 位置平行轴建模方法枚举建模方法 Bin长宽…

【计算机网络中的奈氏准则与香农定理】

文章目录 一、前言二、奈氏准则1. 概念2. 奈氏准则公式3. 奈氏准则的意义 三、香农定理1. 概念2. 香农定理公式3. 香农定理的意义 四、奈氏准则与香农定理的对比五、应用示例1. 奈氏准则示例2. 香农定理示例 六、总结 一、前言 在计算机网络中&#xff0c;数据的传输速率与信道…