算法——动态规划

动态规划有很多重叠子问题,每一个状态一定是由上一个状态推导出来的

贪心没有状态推导,而是从局部直接选最优的

动规五步曲:

  • 确定dp数组(dp table)以及下标的含义

  • 确定递推公式(容斥原理)

  • dp数组如何初始化

  • 确定遍历顺序

  • 举例推导dp数组(用于检验)

一:递推问题

1.1. 如何求解递推问题

正向递推:(递推:一个算法     递归:程序实现的方式,不是算法) 

正向递推(慢):n-------》1-------》递归

逆向递推(快):1-------》n-------》循环  

解决效率过差:

1. 递归过程+记忆化

2. 改成逆向递推求解

动规五步曲:

  • 确定dp数组(dp table)以及下标的含义

        dp[n]:第n个月的兔子总数是dp[n]

  • 确定递推公式(容斥原理)

        容斥原理 :dp[n]全集包括:成年兔 + 幼年兔

        dp[n] = dp[n - 1] + dp[n - 2];

  • dp数组如何初始化

        dp[1] = 1;

        dp[2] = 2;

  • 确定遍历顺序

        从前往后

  • 举例推导dp数组(用于检验)

代码实现:

#include <stdio.h>
#include <stdlib.h>
//正向递推:递归过程+记忆化(提高运行效率)
#define MAX_N 100
int arr[MAX_N + 1] = {0};
int func1(int n) {if (n <= 2) {return n;}if (arr[n]) {return arr[n];}arr[n] = func1(n - 1) + func1(n - 2);return arr[n];
}//逆向递推
int func2(int n) {int *dp = malloc(sizeof(int) * (n + 1));dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}int ret = dp[n];free(dp);return ret;
} int main(int argc, char *argv[]) {int n;scanf("%d", &n);printf("%d\n", func1(n));printf("%d\n", func2(n));return 0;
}

1.2. 容斥原理的基本思想

动规五步曲:

  • 确定dp数组(dp table)以及下标的含义

        dp[i][j]:用前 i 种钱币,凑足 j 元钱的方法总数

  • 确定递推公式(容斥原理)

        容斥原理:dp[i][j]全集包括:没有使用第i种钱币 + 使用第i种钱币

        没有使用第i种钱币:dp[i - 1][j]

        使用第i种钱币:dp[i][j - value[i]]

                                  第一部分:给第i种钱币先留出一个空,用前i种钱币凑够(j - value[i])钱 

                                  第二部分:最后一个空用第i种钱币

        dp[i][j] = dp[i - 1][j] + dp[i][j - value[i]];

  • dp数组如何初始化

1)

        

        

//初始化
for (int i = 1; i <= m; i++) {dp[i][0] = 1;
}
for (int j = 1; j <= n; j++) {if (w[1] <= j && (j % w[1] == 0)) {dp[1][j] = 1;} else {dp[1][j] = 0;}
}

2)

//初始化
memset(dp[0], 0, sizeof(int) * n); //将第0行初始化为0
for (int i = 1; i <= m; i++) {dp[i][0] = 1; //初始化第i行第0列为1
}
  • 确定遍历顺序

        从前往后

  • 举例推导dp数组(用于检验)

代码实现:

//1)动态规划
#include <stdio.h>
#define MAX_N 10000
#define MAX_M 20
int w[MAX_M + 1];
int dp[MAX_M + 1][MAX_N + 1];int main(int argc, char *argv[]) {int m, n; //m种面额的钱币凑足n元钱scanf("%d%d", &m, &n);for (int i = 1; i <= m; i++) {scanf("%d", w + i);}//初始化for (int i = 1; i <= m; i++) {dp[i][0] = 1;}for (int j = 1; j <= n; j++) {if (w[1] <= j && (j % w[1] == 0)) {dp[1][j] = 1;} else {dp[1][j] = 0;}}for (int i = 2; i <= m; i++) {for (int j = 1; j <= n; j++) {dp[i][j] = dp[i - 1][j];if (j < w[i]) {continue;}dp[i][j] += dp[i][j - w[i]];dp[i][j] %= 9973;}}printf("%d\n", dp[m][n]);return 0;
}//2)动态规划
#include <stdio.h>
#include <string.h>#define MAX_N 10000
#define MAX_M 20
int w[MAX_M + 5];
int dp[MAX_M + 5][MAX_N + 5];int main(int argc, char *argv[]) {int m, n; //m种面额的钱币凑足n元钱scanf("%d%d", &m, &n);for (int i = 1; i <= m; i++) {scanf("%d", w + i);}memset(dp[0], 0, sizeof(int) * n); //将第0行初始化为0for (int i = 1; i <= m; i++) {dp[i][0] = 1; //初始化第i行第0列为1for (int j = 1; j <= n; j++) {dp[i][j] = dp[i - 1][j];if (j < w[i]) {continue;}dp[i][j] += dp[i][j - w[i]];dp[i][j] %= 9973;}}printf("%d\n", dp[m][n]);return 0;
}//3)回溯

1.3. 随堂练习1:爬楼梯

动规五步曲:

  • 确定dp数组(dp table)以及下标的含义

        dp[n]:走到第n阶台阶的方法总数

  • 确定递推公式(容斥原理)

        容斥原理:dp[n]全集包括:最后跨2步到达第n阶台阶 + 最后跨3步到达第n阶台阶

        dp[n] = dp[n - 2] + dp[n - 3];

  • dp数组如何初始化

        dp[1] = 0;

        dp[2] = 1;

  • 确定遍历顺序

        从前往后

  • 举例推导dp数组(用于检验)

代码实现:

#include <stdio.h>#define MAX_N 500
int dp[MAX_N + 1];int func(int n) {dp[0] = 1;dp[1] = 0;dp[2] = 1;for (int i = 3; i <= n; i++) {dp[i] = dp[i - 2] + dp[i - 3];}return dp[n];
}int main(int argc, char *argv[]) {int n;scanf("%d", &n);printf("%d\n", func(n));return 0;
}

💖1.4. 随堂练习1:墙壁涂色

   

动规五步曲:

  • 确定dp数组(dp table)以及下标的含义

       dp[n][i][j]代表前n块墙壁,在不考虑头尾成环的前提下,第1块涂颜色i,第n块涂颜色j的方法总数

        此时 i 可以等于 j ,最后统计答案时去除相等的情况

  • 确定递推公式(容斥原理)

        容斥原理:dp[n][i][j]全集包括:第1块涂颜色i,第n-1块涂颜色k(k != j),第n块涂颜色j

        dp[n][i][j] = dp[n-1][i][k](k != j)的累加

  • dp数组如何初始化

        

        

  • 确定遍历顺序

        从前往后

  • 举例推导dp数组(用于检验)

     

二:递推-课后实战题

2.1. 数的划分

动规五步曲:

  • 确定dp数组(dp table)以及下标的含义

        dp[i][j]:将数字 i 分成 j 份的方法总数

  • 确定递推公式(容斥原理)

        容斥原理:dp[i][j]全集包括:拆分方案中有1 + 拆分方案中没有1

        拆分方案中有1:留下最后一个位置放1,dp[i - 1][j - 1]

        拆分方案中没有1:将所有方案中的 j 个数都减1,得到另外一个数(i - j)分成 j                                        份的结果,将i - j的所有方案列出来,每个数都加上1,就是拆分方                                         案中没有1的结果,所以拆分方案中没有1的方法总数 == 将数字 i  -                                         j分成 j 份的方法总数 ,即dp[i - j][j]

        dp[i][j] = dp[i - 1][j - 1] + dp[i - j][j];        

  • dp数组如何初始化

        

        

int dp[MAX_N + 1][MAX_K + 1] = {0};
for (int i = 1; i <= n; i++) {dp[i][1] = 1;
}
  • 确定遍历顺序

        从前往后

  • 举例推导dp数组(用于检验)

代码实现:

//动态规划
#include <stdio.h>#define MAX_N 200
#define MAX_K 6
#define min(a, b) ((a) > (b) ? (b) : (a))int dp[MAX_N + 1][MAX_K + 1] = {0};int main(int argc, char *argv[]) {int n, k;scanf("%d%d", &n, &k);dp[0][0] = 1;for (int i = 1; i <= n; i++) {dp[i][1] = 1;for (int j = 2; j <= min(i, k); j++) {dp[i][j] = dp[i - 1][j - 1] + dp[i - j][j];}}printf("%d\n", dp[n][k]);return 0;
}//回溯

2.2. 数的计算

动规五步曲:

  • 确定dp数组(dp table)以及下标的含义

       dp[i]:以i作为开头的合法的数列个数

  • 确定递推公式(容斥原理)

        容斥原理:dp[i]全集包括:

                          以i作为结尾(不扩展)+ i后面接i/2 + i后面接i/2-1 ...... + i后面接1

                                    1                             dp[i/2]          dp[i/2-1]                dp[1]

        dp[i] = dp[j]的累加(j <= i/2)+ 1                                     

  • dp数组如何初始化

        

  • 确定遍历顺序

        从前往后

  • 举例推导dp数组(用于检验)

代码实现:

#include <stdio.h>#define MAX_N 1000
int dp[MAX_N + 1] = {0};int main(int argc, char *argv[]) {int n;scanf("%d", &n);for (int i = 1; i <= n; i++) {dp[i] = 1;for (int j = 1; j <= i / 2; j++) {dp[i] += dp[j];}}printf("%d\n", dp[n]);return 0;
}

2.3. 神经网络

2.4. 栈

题目描述:1 <= n <=18 的合法出栈序列一共有多少种

动规五步曲:

  • 确定dp数组(dp table)以及下标的含义

        dp[n]:1—n的合法出栈序列方案数

  • 确定递推公式(容斥原理)

        容斥原理:dp[n]全集包括:出栈序列末尾是1的方案数 + 出栈序列末尾是2的方案数 + 出栈序列末尾是3的方案数 + ...... + 出栈序列末尾是n的方案数

        小于x的数不断入栈出栈---》x入栈---》大于x的数不断入栈出栈---》x出栈

        第一部分:小于x的数   第二部分:大于x的数   第三部分:x

        所以出栈序列末尾是x的方案数 = dp[x - 1] * dp[n - x]

        dp[n] = dp[x - 1] * dp[n - x]的累加(x == 1; x <= n; x++)

  • dp数组如何初始化

        int dp[MAX_N + 1] = {0};

        dp[0] = 1;

  • 确定遍历顺序

        从前往后

  • 举例推导dp数组(用于检验)

代码实现:

#include <stdio.h>#define MAX_N 18
int dp[MAX_N + 1] = {0};int main(int argc, char *argv[]) {int n;scanf("%d", &n);dp[0] = 1;for (int i = 1; i <= n; i++) {for (int j = 1; j <= i; j++) {dp[i] += dp[j - 1] * dp[i - j];}}printf("%d\n", dp[n]);return 0;
}

2.5. 循环

2.6. 传球游戏

动规五步曲:

  • 确定dp数组(dp table)以及下标的含义

        dp[j][i]:传了j轮球,球在第i个人手里的方法总数

  • 确定递推公式(容斥原理)

        容斥原理:dp[j][i]全集包括:

                                      倒数第二轮时球在第i-1个人手里 + 倒数第二轮时球在第 i+1个人手里

                                                    dp[j - 1][i - 1]                              dp[j - 1][i + 1]

        dp[j][i] = dp[j - 1][i - 1] + dp[j - 1][i + 1]

  • dp数组如何初始化

        

  • 确定遍历顺序

        从前往后

  • 举例推导dp数组(用于检验)

代码实现:

#include <stdio.h>#define MAX_N 30
#define MAX_M 30
int dp[MAX_N + 1][MAX_N + 1] = {0};int main(int argc, char *argv[]) {int n, m;scanf("%d%d", &n, &m);dp[0][1] = 1;for (int j = 1; j <= m; j++) {for (int i = 2; i <= n - 1; i++) {dp[j][i] = dp[j - 1][i + 1] + dp[j - 1][i - 1];}//单独处理边界dp[j][1] = dp[j - 1][2] + dp[j - 1][n];dp[j][n] = dp[j - 1][1] + dp[j - 1][n - 1];}printf("%d\n", dp[m][1]);return 0;
}

2.7. Hanoi 双塔问题

动规五步曲:

  • 确定dp数组(dp table)以及下标的含义

  • 确定递推公式(容斥原理)

  • dp数组如何初始化

  • 确定遍历顺序

  • 举例推导dp数组(用于检验)

三:动态规划

3.1. 全面剖析:数字三角形问题

1. 斐波那契数

动规五部曲:

1. 确定dp数组以及下标的含义        

         一维dp数组保存递归的结果

        dp[i]的定义为:第i个数的斐波那契数值是dp[i]

2. 确定递推公式

        状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];

3. dp数组如何初始化

        dp[0] = 0;
        dp[1] = 1;

4. 确定遍历顺序

        从递归公式dp[i] = dp[i - 1] + dp[i - 2]中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的

5. 举例推导dp数组

        按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导一下,当n为10的时候,dp数组应该是如下的数列:   0 1 1 2 3 5 8 13 21 34 55

代码实现:

//1) 动归第一种解法 时间复杂度:O(n)  空间复杂度:O(n)
int fib(int n) {if (n <= 1) {return n;}int *dp = malloc(sizeof(int) * (n + 1));dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}int ret = dp[n]; //防止内存泄漏free(dp);return ret;
}//2) 动规第二种解法  时间复杂度:O(n)  空间复杂度:O(1)
int fib(int n) {if (n <= 1) {return n;}int dp[2];dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; i++) {int sum = dp[0] + dp[1];dp[0] = dp[1];dp[1] = sum;}return dp[1];
}//3) 递归+记忆化解法
#define MAX_N 30
int arr[MAX_N + 1] = {0}; //优化:记忆化(防止大量重复运算,加快运行效率)
int fib(int n) {if (n <= 1) {return n;}if (arr[n]) {return arr[n];}arr[n] = fib(n - 1) + fib(n - 2);return arr[n];
}

2. 爬楼梯

动规五步曲:

1. 确定dp数组以及下标的含义

一维dp数组保存递归的结果

dp[i]:爬到第i层楼梯,有dp[i]种方法

2. 确定递推公式

从dp[i]的定义可以看出,dp[i] 可以有两个方向推出来

首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶就是dp[i]了

还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶就是dp[i]了

那么dp[i]就是 dp[i - 1]与dp[i - 2]之和!

所以dp[i] = dp[i - 1] + dp[i - 2] 

3. dp数组如何初始化

dp[1] = 1

dp[2] = 2

4. 确定遍历顺序

从递推公式dp[i] = dp[i - 1] + dp[i - 2]中可以看出,遍历顺序一定是从前向后遍历的

5. 举例推导dp数组

举例当n为5的时候,dp table(dp数组)应该是这样的

代码实现:

//动规
int climbStairs(int n) {if (n <= 2) {return n;}int dp[3];dp[1] = 1; //上一层台阶dp[2] = 2; //上两层台阶for (int i = 3; i <= n; i++) {int sum = dp[1] + dp[2];dp[1] = dp[2];dp[2] = sum;}return dp[2];
}//递归
#include <stdio.h>
#define MAX_N 45
int arr[MAX_N + 1] = {0}; //记忆化优化
int climbStairs(int n) {if (n <= 2) {return n;}if (arr[n])return arr[n];arr[n] = climbStairs(n - 1) + climbStairs(n - 2);return arr[n];
}

3. 使用最小花费爬楼梯

动规五步曲:

1. 确定dp数组以及下标的含义

使用动态规划,就要有一个数组来记录状态,本题只需要一个一维数组dp[i]就可以了

dp[i]的定义:第i个台阶所花费的最少体力为dp[i]

2. 确定递推公式

可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]

那么究竟是选dp[i-1]还是dp[i-2]呢?

一定是选最小的,所以dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];

3. dp数组如何初始化

dp[0] = cost[0];
dp[1] = cost[1];

4. 确定遍历顺序

因为是模拟台阶,而且dp[i]又dp[i-1]dp[i-2]推出,所以是从前到后遍历cost数组就可以了

5. 举例推导dp数组

拿示例2:cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] ,来模拟一下dp数组的状态变化,如下:

代码实现:

#define min(a, b)  ((a) > (b) ? (b) : (a))
int minCostClimbingStairs(int* cost, int costSize) {int *dp = malloc(sizeof(int) * (costSize + 1));dp[0] = dp[1] = 0;for (int i = 2; i <= costSize; i++) {dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[costSize];
}

4. 不同路径

动规五步曲:

1. 确定dp数组(dp table)以及下标的含义

dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径

2. 确定递推公式

想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]

此时在回顾一下 dp[i - 1][j] 表示啥,是从(0, 0)的位置到(i - 1, j)有几条路径,dp[i][j - 1]同理

那么很自然,dp[i][j] =  dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来

3. dp数组的初始化

p[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。

for (int i = 0; i < m; i++) {dp[i][0] = 1;
}
for (int j = 0; j < n; j++) {dp[0][j] = 1;
}

4. 确定遍历顺序

递归公式dp[i][j] =  dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。

5. 举例推导dp数组

代码实现:

int uniquePaths(int m, int n) {//动态创建一个二维路径答案表int **dp = (int **)malloc(sizeof(int *) * m);for (int i = 0; i < m; i++) {dp[i] = (int *)malloc(sizeof(int) * n);}//最左一行for (int i = 0; i < m; i++) { dp[i][0] = 1;}//最上一行for (int j = 0; j < n; j++) {dp[0][j] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];
}

5. 不同路径 II

动规五步曲:

1. 确定dp数组(dp table)以及下标的含义

dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径

2. 确定递推公式

dp[i][j] =  dp[i - 1][j] + dp[i][j - 1]

(i, j)如果就是障碍的话应该就保持初始状态(初始状态为0)

//当(i, j)没有障碍的时候,再推导dp[i][j]
if (obstacleGrid[i][j] == 0) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}

3. dp数组如何初始化

for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) {dp[i][0] = 1;
}
for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) {dp[0][j] = 1;
}

4. 确定遍历顺序

从左到右一层一层遍历

5. 举例推导dp数组

拿示例1来举例如题:


对应的dp table 如图:

代码实现:

6. 整数拆分

动规五步曲:

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

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

相关文章

分享89个清新唯美PPT,总有一款适合您

分享89个清新唯美PPT&#xff0c;总有一款适合您 89个清新唯美PPT下载链接&#xff1a;https://pan.baidu.com/s/14DAA9jvVmlQZ_FJ4DNy9Rw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整…

Java Class文件结构细节最全解读

官方文档位置&#xff1a;https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html Class 类的本质 任何一个Class文件都对应着唯一一个类或接口的定义信息&#xff0c;但反过来说&#xff0c;Class文件实际上它并不一定以磁盘文件的形式存在。Class 文件是一组以8位字…

解决电脑蓝屏问题:SYSTEM_THREAD_EXCEPTION_NOT_HANDLED,回到系统还原点

解决电脑蓝屏问题&#xff1a;SYSTEM_THREAD_EXCEPTION_NOT_HANDLED&#xff0c;回到系统还原点 1&#xff0c;蓝屏显示问题1.1&#xff0c;蓝屏1&#xff0c;清楚显示1.2&#xff0c;蓝屏2&#xff0c;模糊显示 2&#xff0c;排除故障问题3&#xff0c;解决蓝屏的有效方法 1&a…

Mac电脑音乐标签管理 Yate 激活最新 for Mac

Yate是一款非常实用的音频编辑和标记软件&#xff0c;它提供了丰富的功能和工具来帮助用户编辑、整理和管理音频文件。无论是在音乐收藏管理、DJ和音乐制作方面&#xff0c;还是在其他需要处理大量音频文件的领域&#xff0c;Yate都是非常值得推荐的工具。 Yate for Mac功能特…

(2)(2.2) Lightware SF45/B(350度)

文章目录 前言 1 安装SF45/B 2 连接自动驾驶仪 3 通过地面站进行配置 4 参数说明 前言 Lightware SF45/B 激光雷达(Lightware SF45/B lidar)是一种小型扫描激光雷达&#xff08;重约 50g&#xff09;&#xff0c;扫描度可达 350 度&#xff0c;扫描范围 50m。 1 安装SF45…

安全风险综合监测预警平台建设指南(2023 版)》正式发布,汉威科技方案领跑行业

11月24日&#xff0c;国务院安委会办公室印发《城市安全风险综合监测预警平台建设指南&#xff08;2023版&#xff09;》&#xff08;以下简称“指南”&#xff09;&#xff0c;引发行业密切关注。 据悉&#xff0c;“指南”在总结前期18 个试点城市&#xff08;区&#xff09;…

一文回顾 Polkadot 跨链技术演进,了解 Polkadot 2.0 的未来

Polkadot 的起源、完善和上线过程经历了怎样的技术迭新与路线升级&#xff1f;深入把握 Polkadot 技术模型与生态合约才能让我们更好地深耕 Polkadot 生态。 11 月 25 日晚上&#xff0c;Substrate Saturday 第 19 期活动如期举行&#xff0c;Parity 工程师 Suvi Dong、Kaicha…

MJPG-streamer方案实现物联网视频监控

目录 前言 一、JPEG&#xff0c;MJPG格式简介 JPEG MJPG MJPG的优点 MJPG的缺点 二、软硬件准备 三、编译MJPG-streamer 四、运行MJPG-streamer 五、其它常见用法 六、MJPG-streamer 程序框架 七、源码下载 前言 最近想做一个安防相关的项目&#xff0c;所以跟着韦…

RubyMine 2023 年下载、安装、使用教程,详细图解

大家好&#xff0c;今天为大家带来的是RubyMine 2023 年下载、安装、使用教程&#xff0c;详细图解。 文章目录 1 RubyMine 简介2 RubyMine 下载、安装教程RubyMine 下载RubyMine 安装 3 RubyMine 汉化4. 常用快捷键一级必会二级进阶 1 RubyMine 简介 RubyMine 是一个为 Ruby …

什么是企业资金

我从两个方面来诠释企业资金管理&#xff1a; 1、企业资金管理是什么&#xff1f; 2、企业资金管理包括什么&#xff1f; 一、企业资金管理是什么&#xff1f; 众所周知&#xff0c;每个企业都有对应的财务部门&#xff0c;专门负责管理企业的“钱”&#xff0c;和企业的“帐…

决策树(Classification and Regression Tree)

学了数据结构的树后&#xff0c;一直没发现树有哪些应用。学而时习&#xff08;实践&#xff09;之&#xff0c;不亦说乎&#xff1f;故特地上网查了查树的应用&#xff0c;在下阐释&#xff1a; 1.文件系统&#xff1a;文件和目录的组织通常以树的形式表示&#xff0c;允许高效…

前端项目中获取浏览器版本的方法

在我们的前端项目中&#xff0c;navigator.userAgent属性含有当前浏览器相关信息&#xff08;比如版本号&#xff09;。 所以当我们想要获取用户当前访问的浏览器的版本时直接去解析navigator.userAgent字段就中。 废话不多说&#xff0c;下面看封装的获取浏览器版本的函数&am…

亚马逊云与生成式 AI 的融合——生成式AI的应用领域

文章目录 前言亚马逊云科技增强客户体验聊天机器人和虚拟助手亚马逊云科技 鸿翼&#xff1a;提供精准检索和问答&#xff0c;显著提升全球化售后服务体验AI 赋能的联络中心智能导购&个性化推荐智慧数字人 提升员工生成力和创造力对话式搜索亚马逊云科技 西门子&#xff1…

论文精读 Co-DETR(Co-DINO、Co-Deformable-DETR)

DETRs with Collaborative Hybrid Assignments Training 基于协作混合分配训练的DETRs 论文链接&#xff1a;2211.12860.pdf (arxiv.org) 源码链接&#xff1a;https://github.com/Sense-X/Co-DETR 总结&#xff1a; Co-DETR基于DAB-DETR、Deformable-DETR和DINO网络进行了实…

观测云产品更新 | 监控、数据脱敏、快照分享等优化

观测云更新 监控 1、监控器 - 事件内容插入链接的联动优化&#xff1a;根据检测指标自动生成跳转链接&#xff0c;支持在插入链接后调整过滤条件和时间范围&#xff0c;您也可以自定义跳转链接。其中&#xff0c;若需要插入跳转到仪表板的链接&#xff0c;基于以上逻辑&#…

UniGUI官方Demo打开慢的问题

C:\Program Files (x86)\FMSoft\Framework\uniGUI\Demos\Desktop\AllFeaturesDemo\mdemo.dproj 运行时浏览器加载慢由于Demo中访问了Google服务器&#xff0c;导致了浏览器加载慢&#xff0c;将Demo中Google服务器地址删除即可https://maps.googleapis.com/maps/api/js?sensor…

【渗透】记录阿里云CentOS被渗透攻击

文章目录 发现排查安装Nethogs查询情况 最终方案 发现 流量异常&#xff0c;出现大流量&#xff0c;网络贷带宽占满情况 排查 安装Nethogs 1.1 Nethogs介绍 NetHogs是一个开源的命令行工具&#xff08;类似于Linux的top命令&#xff09;&#xff0c;用来按进程或程序实时统…

智能优化算法应用:基于乌鸦算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于乌鸦算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于乌鸦算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.乌鸦算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

ruoyi+Hadoop+hbase实现大数据存储查询

前言 有个现实的需求&#xff0c;数据量可能在100亿条左右。现有的数据库是SQL Server&#xff0c;随着采集的数据不断的填充&#xff0c;查询的效率越来越慢&#xff08;现有的SQL Server查询已经需要数十秒钟的时间&#xff09;&#xff0c;看看有没有优化的方案。 考虑过S…

HTML——表单详解

表单元素 一、表单的用途 HTML 表单用于收集用户的输入信息。 HTML 表单表示文档中的一个区域&#xff0c;此区域包含交互控件&#xff0c;将用户收集到的信息发送到 Web 服务器。 一个表单有三个基本组成部分&#xff1a; 表单标签&#xff1a;这包含了处理表单数据所用的…