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

数据结构与算法-动态规划-区间dp,状态机dp,树形dp


3-区间 DP

介绍

通常用 (dp[i][j]) 表示区间 ([i, j]) 上的某种最优值,比如 (dp[i][j]) 可以表示从下标 (i) 到 (j) 的元素进行某种操作所得到的最大收益、最小花费等。
状态转移方程:这是区间 DP 的关键。它描述了如何从较小的区间的最优解得到较大区间的最优解。例如,对于一个表达式求值问题,可能有 (dp[i][j] = max{dp[i][k] + dp[k + 1][j] + text{合并操作}(i, k, j)}),其中 (i leq k < j),即通过枚举区间 ([i, j]) 内的分割点 (k),将区间 ([i, j]) 拆分成两个子区间 ([i, k]) 和 ([k + 1, j]),然后根据具体问题的要求进行合并操作。

初始化:一般需要初始化长度为 1 的区间,即 (dp[i][i]) 的值,这通常根据问题的具体情况来确定。例如在某些问题中, (dp[i][i]) 可能表示单个元素的某种属性值。

计算顺序:按照区间长度从小到大的顺序进行计算。先计算长度为 2 的区间的 (dp) 值,再计算长度为 3 的区间,以此类推,直到计算出长度为 (n)(问题规模)的区间的 (dp) 值。这样可以保证在计算较大区间时,其所依赖的小区间的最优解已经计算出来。
 

模板

cpp

// 初始化for (int i = 1; i <= n; i++) {

    dp[i][i] = 初始值; }

// 区间长度从 2 开始递增for (int len = 2; len <= n; len++) {

    for (int i = 1; i + len - 1 <= n; i++) {

        int j = i + len - 1;

        for (int k = i; k < j; k++) {

            dp[i][j] = 某种状态转移; 

        }

    }}

例题:石子合并问题

在一个圆形操场的四周摆放 N 堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的 2 堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。试计算出将 N 堆石子合并成 1 堆的最小得分和最大得分。

#include <iostream>

#include <cstring>

#include <algorithm>

using namespace std;

const int N = 210;  // 因为要处理环形,数组长度翻倍

const int INF = 0x3f3f3f3f;

int f[N][N], g[N][N];  // f 记录最大得分,g 记录最小得分

int pre[N];  // 前缀和数组

int n;

int a[N];

int main() {

    cin >> n;

    for (int i = 1; i <= n; i++) {

        cin >> a[i];

        a[i + n] = a[i];  // 复制数组以处理环形

    }

    // 计算前缀和

    for (int i = 1; i <= 2 * n; i++) {

        pre[i] = pre[i - 1] + a[i];

    }

    // 初始化 f 和 g 数组

    memset(f, -INF, sizeof f);

    memset(g, INF, sizeof g);

    for (int i = 1; i <= 2 * n; i++) {

        f[i][i] = g[i][i] = 0;

    }

    // 动态规划计算

    for (int len = 2; len <= n; len++) {

        for (int i = 1; i + len - 1 <= 2 * n; i++) {

            int j = i + len - 1;

            for (int k = i; k < j; k++) {

                f[i][j] = max(f[i][j], f[i][k] + f[k + 1][j] + pre[j] - pre[i - 1]);

                g[i][j] = min(g[i][j], g[i][k] + g[k + 1][j] + pre[j] - pre[i - 1]);

            }

        }

    }

    // 找出长度为 n 的区间的最小和最大得分

    int max_score = -INF, min_score = INF;

    for (int i = 1; i <= n; i++) {

        max_score = max(max_score, f[i][i + n - 1]);

        min_score = min(min_score, g[i][i + n - 1]);

    }

    cout << min_score << endl << max_score;

    return 0;

}    

4-状态机 DP

介绍

状态机 DP 引入了状态机的概念,帮助我们更好地进行状态转移。通过定义不同的状态,明确状态之间的转移关系,从而找出合适的状态转移方程。常见的有 2 状态、3 状态甚至 k 状态的情况。

模板

cpp

// 初始化状态数组memset(dp, 初始值, sizeof dp);

// 遍历每个阶段for (int i = 1; i <= n; i++) {

    // 遍历每个状态

    for (int j = 0; j < 状态数; j++) {

        // 根据状态转移方程更新状态

        dp[i][j] = 某种状态转移; 

    }}

例题 1:大盗阿福

不能抢相邻的店铺,设置两个状态:0 表示不抢,1 表示抢。

代码

cpp

#include <iostream>#include <algorithm>#include <cstring>using namespace std;

const int N = 100010;int f[N][2];int a[N];int n;

int main() {

    int T;

    cin >> T;

    while (T--) {

        cin >> n;

        for (int i = 1; i <= n; i++) cin >> a[i];

        f[0][0] = 0, f[0][1] = -0x3f3f3f3f;

        for (int i = 1; i <= n; i++) {

            f[i][1] = f[i - 1][0] + a[i];

            f[i][0] = max(f[i - 1][0], f[i - 1][1]);

        }

        cout << max(f[n][0], f[n][1]) << endl;

    }

    return 0;}

例题 2:股票交易问题

给定一个整数数组 prices 和一个整数 k,其中 prices[i] 是某支给定的股票在第 i 天的价格。最多可以完成 k 笔交易,不能同时参与多笔交易(必须在再次购买前出售掉之前的股票),计算所能获取的最大利润。

代码

#include <iostream>

#include <vector>

#include <cstring>

#include <algorithm>

using namespace std;

class Solution {

public:

    int maxProfit(int k, vector<int>& prices) {

        int n = prices.size();

        int f[1010][101][2];

        memset(f, -0x3f, sizeof f);

        for (int i = 0; i <= n; i++) f[i][0][0] = 0;

        for (int i = 1; i <= n; i++) {

            for (int j = 1; j <= min(i, k); j++) {

                f[i][j][0] = max(f[i - 1][j][0], f[i - 1][j][1] + prices[i - 1]);

                f[i][j][1] = max(f[i - 1][j][1], f[i - 1][j - 1][0] - prices[i - 1]);

            }

        }

        int ans = 0;

        for (int i = 1; i <= k; i++) ans = max(ans, f[n][i][0]);

        return ans;

    }

};    

同理可以加入股票冷冻期变成3个状态:可购入,可卖出,冷冻期
当然还有k状态的,很多很多,总之状态机是为了让我们可以更好的找出转移方程

5-树形 DP

介绍

算法如其名,在树形结构上的dp问题,经常搭配dfs一起食用
定义:树形 DP 以树作为数据结构,利用树的递归性质和无环特性,自底向上或自顶向下地在树上进行状态转移,从而求解问题的最优解。与一般动态规划类似,树形 DP 通过把原问题分解为多个子问题,并保存子问题的解来避免重复计算,以提高算法效率。

原理基础:树的每个节点及其子树构成一个独立的子问题,父节点的状态往往依赖于子节点的状态。例如,在一棵表示家族关系的树中,要计算整个家族的某种属性(如财富总值),可以先计算每个子家族(以每个子节点为根的子树)的该属性值,再汇总到根节点。

定义状态:根据问题的性质,为树的每个节点定义合适的状态。状态通常包含与该节点及其子树相关的信息,例如,在计算树中最长路径问题时,可能定义状态为从该节点出发到子树中某一叶子节点的最长路径长度。

确定状态转移方程:这是树形 DP 的关键步骤。根据问题的逻辑,确定父节点状态如何由子节点状态推导得出。例如,对于求树的最大独立集(选取一些节点,使得任意两个选取的节点不相邻,且选取节点数量最多)问题,对于某节点i,其状态转移方程可能为:选择节点i时,最大独立集大小等于该节点值加上所有孙子节点的最大独立集大小之和;不选择节点i时,最大独立集大小等于所有子节点的最大独立集大小之和。即dp[i][0] = max(dp[i][0], dp[j][1])(j为i的子节点,表示不选i),dp[i][1] = w[i] + sum(dp[k][0])(k为j的子节点,表示选i,w[i]为节点i的值)。

选择遍历顺序:

自底向上:从叶子节点开始,逐步向上更新节点状态,直到根节点。这种方式适用于子节点状态确定后,父节点状态可以直接推导的问题。例如在计算树的节点深度时,叶子节点深度为 0,通过叶子节点深度可以计算其父节点深度,以此类推直到根节点。

自顶向下:从根节点出发,递归地向子节点传递信息并更新状态。适用于父节点状态影响子节点状态计算的问题。比如在一些需要考虑从根到当前节点路径信息的问题中,根节点的信息可以在向下遍历过程中传递给子节点。

初始化状态:根据问题的具体情况,为树的节点初始化状态值。例如,对于一些计数问题,可能初始值设为 0;对于求最值问题,可能初始值设为负无穷(求最大值时)或正无穷(求最小值时)。

计算结果:经过状态转移后,根节点的状态值通常就是问题的解。例如在计算树的直径(树中最长路径的长度)问题中,根节点最终计算得到的状态值就是树的直径。
 

模板

cpp

// 定义树的邻接表

vector<int> tree[N];// 定义状态数组int dp[N][状态数];

// 深度优先搜索函数void dfs(int u, int fa) {

    // 初始化当前节点的状态

    dp[u][状态] = 初始值; 

    // 遍历当前节点的子节点

    for (int i = 0; i < tree[u].size(); i++) {

        int v = tree[u][i];

        if (v == fa) continue;

        dfs(v, u);

        // 根据状态转移方程更新当前节点的状态

        dp[u][状态] = 某种状态转移; 

    }}

例题:大学职员宴会问题

某大学有 n 个职员,他们之间有从属关系,形成一棵以校长为根的树。宴会每邀请来一个职员都会增加一定的快乐指数,但如果某个职员的直接上司来参加舞会了,那么这个职员就不肯来参加舞会。计算邀请哪些职员可以使快乐指数最大,求最大的快乐指数。

#include <bits/stdc++.h>

using namespace std;

const int N = 6010;

int a[N];

int n;

unordered_map<int, vector<int>> p;

int is[N] = {0};

int ans = 0;

int f[N][2] = {0};

void dfs(int e) {

    f[e][1] = a[e];

    for (int i = 0; i < p[e].size(); i++) {

        int son = p[e][i];

        dfs(son);

        f[e][1] += f[son][0];

        f[e][0] += max(f[son][0], f[son][1]);

    }

}

int main() {

    cin >> n;

    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);

    for (int i = 0; i < n - 1; i++) {

        int u, v;

        cin >> u >> v;

        is[u] = 1;

        p[v].push_back(u);

    }

    int boss = 0;

    for (int i = 1; i <= n; i++) {

        if (!is[i]) {

            boss = i;

            break;

        }

    }

    dfs(boss);

    cout << max(f[boss][1], f[boss][0]);

    return 0;

}    

例题:树的直径问题

树的直径是树中最长路径的长度。可以使用 f1 和 f2 两个数组,通过一次 DFS 计算出树的直径。

代码

cpp

#include <iostream>#include <vector>#include <cstring>using namespace std;

const int N = 10010;

vector<pair<int, int>> tree[N];int f1[N], f2[N];int ans = 0;

void dfs(int u, int fa) {

    f1[u] = f2[u] = 0;

    for (int i = 0; i < tree[u].size(); i++) {

        int v = tree[u][i].first;

        int w = tree[u][i].second;

        if (v == fa) continue;

        dfs(v, u);

        int t = f1[v] + w;

        if (t > f1[u]) {

            f2[u] = f1[u];

            f1[u] = t;

        } else if (t > f2[u]) {

            f2[u] = t;

        }

    }

    ans = max(ans, f1[u] + f2[u]);}

int main() {

    int n;

    cin >> n;

    for (int i = 0; i < n - 1; i++) {

        int u, v, w;

        cin >> u >> v >> w;

        tree[u].push_back({v, w});

        tree[v].push_back({u, w});

    }

    dfs(1, -1);

    cout << ans << endl;

    return 0;}

例题:树的中心问题

树的中心是指树中一个节点,使得该节点到树中其他节点的最大距离最小。可以使用 up、f1、f2 三个数组,通过两次 DFS 解决。第一次 DFS 求出 f1、f2 并记录 f1 的转移路径,第二次 DFS 计算出 up。

代码

cpp

#include <iostream>#include <vector>#include <cstring>#include <algorithm>using namespace std;

const int N = 10010;

vector<pair<int, int>> tree[N];int f1[N], f2[N], up[N], p1[N];int ans = 0x3f3f3f3f;

void dfs1(int u, int fa) {

    f1[u] = f2[u] = 0;

    for (int i = 0; i < tree[u].size(); i++) {

        int v = tree[u][i].first;

        int w = tree[u][i].second;

        if (v == fa) continue;

        dfs1(v, u);

        int t = f1[v] + w;

        if (t > f1[u]) {

            f2[u] = f1[u];

            f1[u] = t;

            p1[u] = v;

        } else if (t > f2[u]) {

            f2[u] = t;

        }

    }}

void dfs2(int u, int fa) {

    for (int i = 0; i < tree[u].size(); i++) {

        int v = tree[u][i].first;

        int w = tree[u][i].second;

        if (v == fa) continue;

        if (p1[u] == v) {

            up[v] = max(up[u], f2[u]) + w;

        } else {

            up[v] = max(up[u], f1[u]) + w;

        }

        dfs2(v, u);

    }}

int main() {

    int n;

    cin >> n;

    for (int i = 0; i < n - 1; i++) {

        int u, v, w;

        cin >> u >> v >> w;

        tree[u].push_back({v, w});

        tree[v].push_back({u, w});

    }

    dfs1(1, -1);

    dfs2(1, -1);

    for (int i = 1; i <= n; i++) {

        ans = min(ans, max(up[i], f1[i]));

    }

    cout << ans << endl;

    return 0;}

相关文章:

数据结构与算法-动态规划-区间dp,状态机dp,树形dp

3-区间 DP 介绍 通常用 (dp[i][j]) 表示区间 ([i, j]) 上的某种最优值&#xff0c;比如 (dp[i][j]) 可以表示从下标 (i) 到 (j) 的元素进行某种操作所得到的最大收益、最小花费等。 状态转移方程&#xff1a;这是区间 DP 的关键。它描述了如何从较小的区间的最优解得到较大区…...

文件内容课堂总结

Spark-Core编程 Key-Value类型&#xff1a; partitionBy函数根据指定Partitioner重新进行分区&#xff0c;默认使用HashPartitioner groupByKey函数根据key对value进行分组&#xff0c;有三种函数签名 reduceByKey函数将数据按相同Key对Value进行聚合&#xff0c;与groupByKey相…...

【树莓派Pico FreeRTOS】-任务通知

任务通知 文章目录 任务通知1、硬件准备2、软件准备3、FreeRTOS的任务通知介绍4、任务通知数据传输实例RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 RAM,并支持高达 16MB 的片外闪存。 广泛的灵活 I/O 选项包括 I2C、SPI 和独特的可编程 I/O (…...

c++11新内容补充

1.列表初始化 1.1传统{ }初始化 c98的{ }初始化主要是用于数组&#xff0c;以及结构体 1.2c11{ }初始化 1.让内置类型和自定义类型都可以用{ }实现多个数据初始化&#xff0c;而自定义类型的实现原理是类型转换&#xff08;没优化的版本是先构造临时对象&#xff0c;然后拷贝构…...

动态规划基础

动态规划 动态规划概论楼梯最短路最长上升子序列&#xff08;LIS)最长公共子序列&#xff08;LCS)最长回文子串 概率动态规划区间动态规划石子合并括号序列石子合并&#xff08;环形&#xff09; 树形动态规划统计人数没有上司的舞会 背包01背包完全背包多重背包分组背包 动态规…...

导入 Excel 批量替换文件名称及扩展名

重命名的需求是多种多样的&#xff0c;我们一个方法或一个工具很难说完全满足 100% 的文件重命名的需求。如果我们的文件重命名的需求非常的复杂的时候&#xff0c;我们能否有一个万全的方法来帮我们实现呢&#xff1f;那今天就给大家介绍一下导入 excel 的方式批量修改文件名称…...

降低AIGC检测率的AI润色提示词模板

以下是针对降低AIGC检测率的 AI润色提示词模板&#xff0c;涵盖语言风格优化、逻辑重构、学术规范强化等维度&#xff0c;结合反检测策略设计&#xff0c;可直接用于DeepSeek等工具&#xff1a; 一、标题与摘要优化 1. 标题去AI化 提示词&#xff1a; 请将以下标题改写成更学…...

系统思考—提升解决动态性复杂问题能力

感谢合作伙伴的信任推荐&#xff01; 客户今年的人才发展重点之一&#xff0c;是提升管理者应对动态性、复杂性问题的能力。 在深入交流后&#xff0c;系统思考作为关键能力模块&#xff0c;最终被纳入轮训项目——这不仅是一次培训合作&#xff0c;更是一场共同认知的跃迁&am…...

spring--整合Mybatis详解

整合Mybatis 步骤&#xff1a; 1.导入相关Maven依赖 junit mybatis mysql数据库连接 spring相关的 aop织入 mybatis-spring 2.编写配置文件 3.测试 回忆mybatis 还需连接数据库 导入依赖&#xff1a; <dependencies><dependency><groupId>juni…...

深入理解 HTML5 Audio:网页音频播放的新时代

在网页开发领域,音频的嵌入和播放一直是一个重要且不断演进的话题。HTML5 的出现,为网页音频播放带来了标准化的解决方案,极大地改善了开发者和用户的体验。 一、HTML5 之前的音频播放状况 在 HTML5 诞生之前,互联网上缺乏统一的网页音频播放标准。当时,大多数音频播放依…...

Cloudflare 缓存工作原理

Cloudflare 缓存是 Cloudflare 内容分发网络&#xff08;CDN&#xff09;的一个关键组成部分&#xff0c;通过在靠近用户的全球网络边缘服务器上存储和交付内容&#xff0c;显著提升网站性能。以下是关于 Cloudflare 缓存的相关内容&#xff1a; 工作原理 内容请求&#xff1a…...

【Unity3D中UI与物体可见性的判断方法】

系列文章目录 unity知识点 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、判断UI的可见性1-1、第一种1-2、通过RectTransform计算可视区域1-3、滚动容器内可见性检测&#xff08;Scroll View&#xff09; &#x1f449;二、判断物体的可见性2-1、视锥体检测方法2-2…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(1):承上启下,继续上路

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(1):承上启下,继续上路 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)普通形(ふつうけい)と思います(2)辞書形ことができます(3)Vたことがあります。(4)Vた とき & Vる とき3、单词(1)日语单词(2…...

ubuntu24.04 cmake 报错 libldap-2.5.so.0 解决办法

apt cmake有毛病 换源重新安装 wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | sudo apt-key add - sudo apt-add-repository "deb https://apt.kitware.com/ubuntu/ $(lsb_release -cs) main" sudo apt update sudo apt in…...

Mac 关闭浏览器左右滑动切换页面的问题

在使用触控板&#xff0c;操作浏览器时&#xff0c;左右滑动时&#xff0c;浏览器容易触发前进或者后退去查看历史记录。 如何关闭呢&#xff1f; 打开Mac- 系统设置-触控板 -更多手势 将轻扫切换页面设置为关&#xff0c;就可以了...

在 openEuler 24.03 (LTS) 操作系统上添加 ollama 作为系统服务的步骤

以下是在 openEuler 操作系统上添加 ollama 作为系统服务的步骤&#xff1a; 创建 systemd 服务文件 sudo vi /etc/systemd/system/ollama.service将以下内容写入服务文件&#xff08;按需修改参数&#xff09;&#xff1a; [Unit] DescriptionOllama Service Afternetwork.…...

华为昇腾服务器上查看固件、驱动和CANN版本的常用方法

Hey小伙伴们~&#x1f44b; 今天来聊聊怎么在华为昇腾服务器上查看固件、驱动和CANN版本吧&#xff01;&#x1f4bb; 这些信息对于确保你的服务器运行顺畅可是超级重要的哦&#xff01;下面就来给大家介绍几种常用的查看方法&#xff01;&#x1f447; &#x1f31f; ‌1. 查…...

击球手怎么玩·棒球1号位

以棒球运动为例&#xff0c;在棒球运动中&#xff0c;击球手&#xff08;Batter&#xff09;是进攻方的核心角色&#xff0c;负责通过击球创造得分机会。以下是结合棒球运动的详细介绍和击球技巧指南&#xff1a; 一、棒球基础规则 比赛目标 击球手需将投手&#xff08;Pitch…...

java基础多态------面试八股文

是什么是多态 类引用指向子类对象&#xff0c;并调用子类重写的方法&#xff0c;实现不同的行为 例子 class Animal {void sound() {System.out.println("动物发出声音");} }class Dog extends Animal {Overridevoid sound() {System.out.println("狗叫&…...

Python中的字典

文章目录 一、Python中的字典1. 字典的特点2. 字典的创建3. 字典的常见操作1. **访问字典中的值**2. **修改字典中的值**3. **添加键值对**4. **删除键值对**5. **检查键是否存在**6. **获取字典的长度**7. **遍历字典** 4. 字典的方法5. 嵌套字典6. 字典的优点7. 示例总结 二、…...

C++对象生命周期管理:从构造到析构的完整指南

在C开发中&#xff0c;准确掌握对象的生命周期管理是避免内存泄漏和资源竞争的关键。本文通过完整代码示例和内存布局分析&#xff0c;深入解析构造/析构顺序、继承体系、智能指针等核心机制&#xff0c;并分享实用调试技巧。 一、成员变量构造顺序&#xff1a;声明即命运 cl…...

代码随想录第14天:(二叉树)

一、找树左下角的值&#xff08;Leetcode 513&#xff09; 递归法&#xff1a; class Solution:def findBottomLeftValue(self, root: TreeNode) -> int:# 初始化最大深度为 -1&#xff0c;表示当前尚未遍历任何节点# 初始化 result 为 None&#xff0c;最终将存储最左边的…...

TCP/UDP的连接和数据发送过程详解

TCP TCP三次握手 在服务端启动好后会调用 listen() 方法&#xff0c;进入到 LISTEN 状态&#xff0c;然后静静等待客户端的连接请求到来。 而此时客户端主动调用 connect(IP地址) &#xff0c;就会向某个IP地址发起第一次握手&#xff0c;会先建立个半连接&#xff0c;发送SYN…...

2. 单词个数统计

【问题描述】 编写一个程序&#xff0c;输入一个句子&#xff0c;然后统计出这个句子当中不同的单词个数。例如&#xff0c;对于句子“one little two little three little boys"&#xff0c;总共有5个不同的单词&#xff0c;one, little, two, three, boys。 说明&…...

Js生成螺旋数组。

这段代码定义了一个名为 vetux 的函数&#xff0c;用于生成一个螺旋矩阵。螺旋矩阵是一种按照螺旋顺序填充数字的二维数组。以下是代码的详细解释&#xff1a; 函数定义 function vetux(n, m) {// 创建一个 m 行 n 列的二维数组&#xff0c;初始值为 0const a new Array(m).…...

《Vue.js组件化开发实战:从安全纵深到性能跃迁》

开篇&#xff1a;组件化开发的工业革命 当全球500强企业的核心业务系统在12.12大促中经受每秒38万次请求冲击时&#xff0c;我们突然意识到&#xff1a;现代前端组件已不再是简单的UI积木&#xff0c;而是承载业务逻辑、安全防护、性能优化的纳米级作战单元。本文将从军工级系统…...

【Git】--- 多人协作实战场景

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; Git 前面我们学习了Git的所有本地仓库的相关操作:git基本操作,分支理解,版本回退,冲突解决等等。同时我们还理解了远端仓库在开发的作用以及相关操作push…...

SmolVLM2: The Smollest Video Model Ever(二)

这是对论文《SmolVLM: Redefining small and efficient multimodal models》的整理与翻译 SmolVLM&#xff1a;重新定义小型高效的多模态模型 拥抱脸、斯坦福大学 图1 小而强大&#xff1a;SmolVLM与其他最先进的小型视觉语言模型&#xff08;VLM&#xff09;的比较。图像结果来…...

如何通过前端表格控件实现自动化报表?1

背景 最近伙伴客户的项目经理遇见一个问题&#xff0c;他们在给甲方做自动化报表工具&#xff0c;项目已经基本做好了&#xff0c;但拿给最终甲方&#xff0c;业务人员不太买账&#xff0c;项目经理为此也是天天抓狂&#xff0c;没有想到合适的应对方案。 现阶段主要面临的问…...

数据库8(函数,变量)

1.数据类型 char(10):不足十个字符&#xff0c;用空格补全&#xff0c;数据定长&#xff1b;非统一字符编码&#xff0c;一个汉字要占两位char(2) nchar(10):不足十个字符&#xff0c;用空格补全&#xff0c;数据定长&#xff1b;统一字符编码&#xff0c;一个汉字占一位 nch…...

电阻式传感器(三)——电位器式传感器等效电路分析

(1)电位器式传感器的基本工作原理 将机械位移或其他可转换为位移变化的非电量转换为与其有一定函数关系的电阻变化&#xff0c;从而引起输出电压变化。 类型 基本结构 旋转型 直线型 非线性型 &#xff08;2&#xff09;电位器式传感器的等效电路分析 电位器式传感器的核…...

LangChain4j(1):初步认识Java 集成 LLM 的技术架构

LangChain 作为构建具备 LLM 能力应用的框架&#xff0c;虽在 Python 领域大放异彩&#xff0c;但 Java 开发者却只能望洋兴叹。LangChain4j 正是为解决这一困境而诞生&#xff0c;它旨在借助 LLM 的强大效能&#xff0c;增强 Java 应用&#xff0c;简化 LLM 功能在Java应用中的…...

力扣刷题——1339.分裂二叉树的最大乘积

给你一棵二叉树&#xff0c;它的根为 root 。请你删除 1 条边&#xff0c;使二叉树分裂成两棵子树&#xff0c;且它们子树和的乘积尽可能大。 由于答案可能会很大&#xff0c;请你将结果对 10^9 7 取模后再返回。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5,6] 输…...

Pytest+Allure+Excel接口自动化测试框架实战

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具&#xff0c;它不仅以 Web 的方式展示了简介的测试结果&#xff0c;而且允…...

交易所开发全流程解析:KYC与U盾在安全合规中的战略价值

——2025年加密资产交易平台的技术架构与风控体系深度实践 一、交易所开发的核心技术架构与流程 1. 系统定位与合规基础 交易所开发需首先明确中心化&#xff08;CEX&#xff09;、去中心化&#xff08;DEX&#xff09;或混合架构的定位。中心化交易所&#xff08;如币安&…...

简单了解一下Unity的Resources.UnloadUnusedAssets

基本概念 Resources.UnloadUnusedAssets()是Unity提供的一个内存管理方法&#xff0c;用于卸载当前未被任何GameObject引用的资源&#xff0c;包括贴图、材质、网格、音频等资源。 在Unity中&#xff0c;资源在加载后会占用内存&#xff0c;而当这些资源不再被场景中的对象引…...

ECMAScript 7~10 新特性

ECMAScript 7 新特性 ECMAScript 6 新特性&#xff08;一&#xff09; ECMAScript 6 新特性&#xff08;二&#xff09; ECMAScript 7~10 新特性&#xff08;本文&#xff09; 1. 数组方法 Array.prototype.includes() 用来检测数组中是否包含指定元素&#xff0c;返回布尔值&…...

leetcode_1. 两数之和_java

1. 两数之和https://leetcode.cn/problems/two-sum/ 1、题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你…...

Mysql索引(四)

1、B树&#xff1a;B树即平衡查找树&#xff0c;一般理解为平衡多路查找树&#xff0c;也称为B-树、B_树。是一种自平衡树状数据结构&#xff0c;能对存储的数据进行O(log n)的时间复杂度进行查找、插入和删除&#xff1b; 1&#xff09;每个节点占用一个盘块的磁盘空间&#x…...

力扣——【1991. 找到数组的中间位置】

#前缀和思想 主要利用递推的思想&#xff0c;将数列的前n&#xff01;项和存到一个新数列中&#xff0c;递推公式可能需要自己推导 一个数列的值等于另一个数列的第i个元素加上这一个数列的第i-1个元素 同时需要初始化这个数列的第一个元素另一个数列的第一个元素 #思路 本…...

在 Linux 系统(ubuntu/kylin)上安装 Docker

在 Linux 系统上安装 Docker 的步骤如下(以 Ubuntu/Debian 和 CentOS/RHEL 为例): 请用./check-config config检查内核是否支持,necessarily 必须全部enable。 以下是脚本自行复制运行: #!/usr/bin/env sh set -eEXITCODE=0# bits of this were adapted from lxc-checkco…...

【实证分析】数智化转型对制造企业全要素生产率的影响及机制探究(1999-2023年)

数智化转型是实现数字经济与实体经济深度融合,推动制造企业高质量可持续发展的必然选择,也是加快新质生产力发展的重要抓手。参照宋冬林&#xff08;2025&#xff09;的做法&#xff0c;对来自科技进步与对策《数智化转型对制造企业全要素生产率的影响及机制探究——基于中国制…...

lower_bound

在C中&#xff0c;lower_bound 返回的是一个迭代器&#xff08;iterator&#xff09;&#xff0c;而不是直接的下标位置。因此&#xff0c;为了得到数组中的索引&#xff08;即 pos1&#xff09;&#xff0c;你需要用返回的迭代器减去数组的起始地址&#xff08;num&#xff09…...

biblatex 的 Biber 警告​​:tex文件运行无法生成参考文献和目录

原因​​&#xff1a;使用了 biblatex 管理参考文献&#xff0c;但未运行 biber 生成参考文献数据。 ​​解决​​&#xff1a;更新 LaTeX Workshop 配置 修改你的 settings.json&#xff0c;添加 biber 工具并更新编译流程&#xff1a; {"latex-workshop.latex.tools&…...

解锁 MCP:模型上下文协议的介绍与应用​,技术解析与应用场景

欢迎来到涛涛聊AI,这几天MCP很火,咱们一起学习下吧。 一、什么是 MCP MCP,即 Model Context Protocol(模型上下文协议),是由 Anthropic 推出的一个具有创新性的开放协议 。它的核心目标是统一 LLM 应用与外部数据源和工具之间的通信方式,为 AI 开发打造标准化的上下文…...

十二种存储器综合对比——《器件手册--存储器》

存储器 名称 特点 用途 EEPROM 可电擦除可编程只读存储器&#xff0c;支持按字节擦除和写入操作&#xff0c;具有非易失性&#xff0c;断电后数据不丢失。 常用于存储少量需要频繁更新的数据&#xff0c;如设备配置参数、用户设置等。 NOR FLASH 支持按字节随机访问&…...

对重大保险风险测试的算法理解

今天与同事聊到重大保险风险测试&#xff0c;借助下面链接的文章&#xff0c; 谈IFRS 17下的重大保险风险测试 - 知乎 谈一下对下图这个公式的理解。 尤其是当看到下面这段文字的解释时&#xff0c;感觉有些算法上的东西&#xff0c;需要再澄清一些。 首先&#xff0c;上面文…...

App Cleaner Pro for Mac 中 Mac软件卸载工具

App Cleaner Pro for Mac 中 Mac软件卸载工具 一、介绍 App Cleaner & Uninstaller Pro Mac破解&#xff0c;是一款Mac软件卸载工具&#xff0c;残余垃圾清除工具&#xff01;可以卸载应用程序或只删除不需要的服务文件&#xff0c;甚至可以删除以前删除的应用程序中的文…...

【操作系统】线程同步:原理、方法与实践

一、线程同步的核心概念 1.1 为什么需要线程同步&#xff1f; 在多线程环境中&#xff0c;当多个线程并发访问共享资源&#xff08;如内存、文件、数据库等&#xff09;时&#xff0c;可能会引发数据竞争&#xff08;Race Condition&#xff09;&#xff0c;导致数据不一致或…...

vue实现二维码生成器和解码器

vue实现二维码生成器和解码器 1.生成基本二维码&#xff1a;根据输入的value生成二维码。 2.可定制尺寸&#xff1a;通过size调整大小。 3.颜色和背景色&#xff1a;设置二维码颜色和背景。 4.静区&#xff08;quiet zone&#xff09;支持&#xff1a;通过quietZone调整周围的…...