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

动态规划经典例题:最长单调递增子序列、完全背包、二维背包、数字三角形硬币找零

一.最长单调递增子序列

设计一个O(n^2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。

实验原理

状态转移方程(递推公式):
对于每个 i,遍历之前的元素 j,如果 nums[j] < nums[i],说明 nums[i] 可以接在 nums[j] 后面形成递增子序列,那么:
dp[i]=max(dp[i],dp[j]+1),0<=j<i

  1. 动态规划数组 dp 初始化:
    数组 dp[i] 表示以 nums[i] 结尾的最长递增子序列的长度。初始化每个 dp[i] 为 1,因为每个元素至少可以作为一个长度为 1 的子序列。
  2. 动态规划填充 dp 数组:
    对于每一个 i,我们遍历所有比 i 小的元素 j(j < i),如果 nums[i] > nums[j],说明可以将 nums[i] 加入到以 nums[j] 为结尾的递增子序列中,因此更新 dp[i] 为 dp[j] + 1。逐步更新每个 dp[i],得到以每个元素结尾的最长递增子序列长度。
  3. 找出最大值:
    最后遍历 dp 数组,找到最大值,即为整个序列的最长递增子序列的长度。
//longest increasing subsequence,设计一个O(n^2)时间的算法,找出由n个数组成的序列的最长单调递增子序列
//思路:定义一个等长数组dp,dp[i]:以nums[i]结尾的递增子序列长度
//dp[i]=max(dp[k])+1, k满足:0<=k<i && nums[k]<nums[i]
//例如    nums 10 9 2 5 3 7   dp   1 1 1 2 2 3
//dp[5]为例,nums[5]=7, 7前面有3个数字小于7:2,5,3。 对应dp为1,2,2,最大dp是2,则dp[5]=2+1=3
//遍历自己前面的节点,找小于自己的数字,从中找dp最大的,加一
#include <stdio.h>
#define MAX_N 1000
int nums[MAX_N]; //输入序列
int dp[MAX_N];   //存储每个位置的LIS长度
int main() {int n;printf("请输入数组长度:\n");scanf("%d", &n);printf("请输入数组元素:\n");for (int i = 0; i < n; i++) { scanf("%d", &nums[i]);}for (int i = 0; i < n; i++) {    // 初始化 dp 数组,每个位置的 LIS 长度至少为 1dp[i] = 1;}for (int i = 1; i < n; i++) {    // 动态规划计算 LISfor (int j = 0; j < i; j++) {if (nums[i] > nums[j]) {dp[i] = (dp[i] > dp[j] + 1) ? dp[i] : dp[j] + 1;}}}int max_length = 0;    // 查找最长的 LIS 长度for (int i = 0; i < n; i++) {if (dp[i] > max_length) {max_length = dp[i];}}printf("%d\n", max_length);    // 输出结果return 0;
}

二.完全背包问题

实验原理

  1. 定义状态
    定义 dp[j] 为背包容量为 j 时,能够获得的最大价值。j 的范围从 0 到 b。
  2. 状态转移方程
    对于每个物品 i,选择放入个数 x[i],重量 a[i],价值 c[i]。对于每一个容量 j,可以选择放入物品 i 的不同数量,直到当前背包容量无法放入更多的物品 i。
    状态转移方程为:
    dp[j] = max(dp[j], dp[j - a[i]] + c[i]) (当 j >= a[i])
    • dp[j] 表示背包容量为 j 时能获得的最大价值。
    • dp[j - a[i]] + c[i] 表示如果选择物品 i 放入背包,则剩余容量为 j - a[i],加上物品 i 的价值 c[i]。
  3. 最终解
    最终找出 dp[b],它表示背包容量为 b 时的最大价值。
  4. 记录最优解
    需要一个额外的数组 x[i] 来存储每种物品的数量。通过回溯的方法来从 dp[b] 反向推导出每个物品的数量。通过比较 dp[j] 和 dp[j - a[i]] + c[i],我们可以确定是否选择了物品 i 以及选择了多少个。
    时间复杂度为 O(n * b),其中 n 是物品的数量,b 是背包容量
    空间复杂度为 O(b),主要是 dp 和 record 数组的空间
    t *dp = (int *)calloc(b + 1, sizeof(int));
    为什么使用 calloc 而不是 malloc?
    malloc:malloc 仅分配内存,并不会初始化内存的值。它可能会留有“垃圾值”,这可能会影响程序的结果。
    calloc:calloc 不仅分配内存,还将内存初始化为 0。对于动态规划问题,初始化为 0 是非常重要的,因为在没有物品放入背包时,背包的价值应当是 0。
    用 record 数组来记录选中了哪些物品:
    假设有以下动态规划过程:
    dp[4] = 5(背包容量为 4 时,选择了物品 2,最大价值为 5)。
    dp[5] = 7(背包容量为 5 时,选择了物品 2 和物品 1,最大价值为 7)。
    在计算 dp[4] 时,如果物品 2 被选中,record[4] = 2。
    当 dp[5] 达到最大价值时,record[5] = 2 和 record[4] = 1,表示物品 2 和物品 1 被选中了。
//整数线性规划问题,即完全背包,n种物品,每种重量a[i],价值c[i],数量x[i]
//求ci乘xi从i=1到n的和的max值
//其中xi为非负整数(1<=i<=n),ai乘xi从i=1到n的和(容量总和)<=b
//设计一个解此问题的动态规划算法,并分析算法的计算复杂性
//状态迁移方程(递推公式):dp[j] = max(dp[j], dp[j - a[i]] + c[i])(j >= a[i])
//求出最优值( max 最大值,也是放进背包的物品的最大价值)
//给出最优解( xi 值, i =1~ n ,也是每种物品装几个)#include<stdio.h>
#include<stdlib.h>
void knapsack(int n,int b,int *a,int *c){//重量a[i],价值c[i],数量x[i],dp[j]容量j时的最大价值int *dp = (int *)calloc(b + 1, sizeof(int));//record记录物品选择情况int *record = (int *)calloc(b + 1, sizeof(int));//计算最大价值for (int i = 0; i < n;i++){for (int j = a[i]; j <= b;j++){if (dp[j] < dp[j - a[i]] + c[i]) {dp[j] = dp[j - a[i]] + c[i];record[j] = i; //当背包容量为 j 时,选择了物品 i}}}printf("最大价值:%d\n", dp[b]);//回溯找出每种物品的选择数量int *x = (int *)calloc(n, sizeof(int));int j = b;while(j>0){int i = record[j];//找最后放入包的物品x[i]++;j -= a[i];//更新背包容量}//输出每种物品的选择printf("每种物品选择的数量:\n");for (int i = 0; i < n;i++){printf("物品%d:%d个\n",i + 1,x[i]);}free(dp);free(record);free(x);
}
int main(){int n, b;printf("请输入物品的种类数n :");scanf("%d", &n);printf("请输入背包容量b:");scanf("%d", &b);int *a = (int *)malloc(n * sizeof(int));int *c = (int *)malloc(n * sizeof(int));printf("请输入每种物品的重量:\n");for (int i = 0; i < n;i++){scanf("%d", &a[i]);}printf("请输入每种物品的价值:\n");for (int i = 0; i < n;i++){scanf("%d", &c[i]);}knapsack(n, b, a, c);free(a);free(c);return 0;
}

三.数字三角形问题

实验原理

每一步只能移动到下一行中相邻的节点上,即与上一层节点下标相同或下标+1。
算法设计: 采用从底部开始向上计算的动态规划方法。每个位置的最大路径和是当前元素值加上其下方相邻元素的最大路径和。我们从底部开始计算每一行的最大路径和,最终得到从顶部到底部的最大路径和。
计算路径和的方式:
从倒数第二行开始,计算每个位置的最大路径和,即:
dp[i][j]=triangle[i][j]+max(dp[i+1][j],dp[i+1][j+1])
计算完成后,最终的最大路径和会存储在 dp[0][0]

//由n行数字组成的三角形,计算从顶至底的一条路径,使该路经过的总和最大
//共包含 n(n+1)/2个元素
#include <stdio.h>
#define MAX_N 100
int triangle[MAX_N][MAX_N];//三角形数据
int dp[MAX_N][MAX_N]; //存储每个位置到达底部的最大路径和
int main() {FILE *input = fopen("input.txt", "r");FILE *output = fopen("output.txt", "w");int n;fscanf(input, "%d", &n);for (int i = 0; i < n; i++) {    // 读取输入的数字三角形for (int j = 0; j <= i; j++) {fscanf(input, "%d", &triangle[i][j]);}}// 初始化 dp 的最后一行,直接赋值为 triangle 的最后一行//由于从底部开始计算,所以最后一行的最大路径和就是它本身的值for (int j = 0; j < n; j++) {dp[n - 1][j] = triangle[n - 1][j];}// 从倒数第二行开始进行动态规划计算for (int i = n - 2; i >= 0; i--) {for (int j = 0; j <= i; j++) {// dp[i][j] = triangle[i][j] + max(dp[i+1][j], dp[i+1][j+1])dp[i][j] = triangle[i][j] + (dp[i + 1][j] > dp[i + 1][j + 1] ? dp[i + 1][j] : dp[i + 1][j + 1]);}}// dp[0][0] 就是从顶端到底端的最大路径和fprintf(output, "%d\n", dp[0][0]);fclose(input);fclose(output);return 0;
}

四.二维背包问题

实验原理

定义 DP 状态:
dp[i][j][k]:表示前 i 个物品中,背包重量不超过 j,体积不超过 k 时的最大价值。
状态转移:对于每个物品 i,我们有两种选择:
不放入背包:此时最大价值为 dp[i-1][j][k]。
放入背包:此时最大价值为 dp[i-1][j-w_i][k-b_i] + v_i,前提是当前背包的重量和体积不超过限制。
状态转移公式为:
dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j-w_i][k-b_i] + v_i)

  1. void inputItems(Item items[], int *n, int *c, int *d)这里用 int *n, int *c, int *d,代表传递给函数的指针。
    传递指针后,inputItems 可以直接通过指针访问并修改这些值,从而改变原始的 n、c 和 d,并在函数外部生效。
  2. memset(dp, 0, sizeof(dp));这个语句是什么意思?
    memset 是一个标准库函数,用来设置一块内存区域的内容。语法如下:
    void *memset(void *ptr, int value, size_t num);
    • ptr:指向要设置的内存区域的指针。
    • value:要设置的值(每个字节将被设置为 value)。
    • num:要设置的字节数。
    作用是将 dp 数组的所有元素初始化为 0。
//二维背包问题,给定n种物品和一个背包
//物品i的重量wᵢ,体积bᵢ,价值vᵢ,背包容量c,容积 d
//应如何选择装入背包中的物品,使得装入背包中物品的总价值最大
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_n 100
#define MAX_c 100
#define MAX_d 100
typedef struct{int weight;int volume;int value;
} Item;
int dp[MAX_n + 1][MAX_c + 1][MAX_d + 1];
void inputItems(Item items[], int *n, int *c, int *d){printf("请输入物品的种数、背包最大重量和容积:\n");scanf("%d %d %d", n, c, d);printf("请输入每个物品的重量、体积和价值:\n");for (int i = 0; i < *n;i++){scanf("%d %d %d", &items[i].weight, &items[i].volume, &items[i].value);}
}
int knapsack(Item items[], int n, int c, int d){memset(dp, 0, sizeof(dp)); //用来设置一块内存区域的内容。语法void *memset(void *ptr, int value, size_t num);/*ptr:指向要设置的内存区域的指针。value:要设置的值(每个字节将被设置为 value)。num:要设置的字节数。*/for (int i = 0; i <= n; i++){ //n个物品for (int j = c; j >= items[i - 1].weight; j--){ //容量递减for (int k = d; k >= items[i - 1].volume;k--){  //容积递减dp[i][j][k] = (dp[i-1][j][k] > dp[i-1][j-items[i-1].weight][k-items[i-1].volume] + items[i-1].value)? dp[i-1][j][k]: dp[i-1][j-items[i-1].weight][k-items[i-1].volume] + items[i-1].value;}}}return dp[n][c][d]; //最大价值
}
int main() {Item items[MAX_n];int n, c, d;inputItems(items, &n, &c, &d);int maxValue = knapsack(items, n, c, d);printf("背包能够获得的最大价值是: %d\n", maxValue);return 0;
}

五.最少钱币问题

实验原理

n 种硬币的面值存储在数组 T[1:n] 中。
Coins[1:n] 存储每种面值的硬币数量。
给定一个目标金额 m,找到最少的硬币数来支付 m。

  1. 状态定义:定义 dp[i] 为金额 i 时所需的最少硬币数。
    初始化:dp[0] = 0,即零金额需要零个硬币,其他金额初始化为一个较大的值(如 INF)。
  2. 状态转移:
    对于每种硬币面值 T[j] 和它的可用数量 Coins[j],我们更新 dp 数组。
    我们需要通过从 1 到 Coins[j] 个 T[j] 面值的硬币来更新 dp。
  3. 最终结果:
    最终的结果为 dp[m],如果它仍然是初始值(即无法支付),则返回 -1。
    时间复杂度:O(n * m),其中 n 是硬币种类数,m 是目标金额。
    空间复杂度:需要一个 dp 数组来存储每个金额所需的最小硬币数。空间复杂度为 O(m)。
  4. 外层循环(遍历每种硬币):
  5. 中层循环(遍历当前硬币的使用数量):
  6. 内层循环(递减遍历金额):目标金额 m 开始,逐渐递减直到面值 T[j]。确保在更新 dp[k] 时不覆盖前面计算得到的值。k 是当前要处理的金额。k - T[j] 表示如果使用了一个面值为 T[j] 的硬币,那么之前的金额是 k - T[j]。
  7. 条件判断与更新:
    if (dp[k - T[j]] != INF): 检查 dp[k - T[j]] 是否已经有解。如果 dp[k - T[j]] != INF,表示用之前的硬币组合已经可以得到金额 k - T[j],那么可以用当前的硬币面值 T[j] 来更新金额 k。
    dp[k] = (dp[k] < dp[k - T[j]] + 1) ? dp[k] : dp[k - T[j]] + 1;:如果原来 dp[k] 更小(已经找到了一个较小的解),就保持原来的 dp[k];否则,更新为 dp[k - T[j]] + 1,即在用完 k - T[j] 这个金额的基础上,再加一个当前硬币 T[j]。
//设有n种不同面值的硬币,各硬币的面值存在于数组T[1:n]中
//现要用这些面值的硬币来找钱,对任意钱数0<=m<=20001,设计一个最少硬币找钱m的方法
//给定硬币种数n(1<=n<=10),硬币面值数组T和可用的各面值的硬币数组Coins,以及钱数m
//由input.txt输入数据,第1行n,第2行起每行两个数T[j]和Coins[j],最后一行找钱数m
//将计算出的最少硬币数输出到output.txt, 问题无解时输出-1
#include <stdio.h>
#include <limits.h>
#define MAX_M 20001  // 最大金额
#define INF INT_MAX  // 无解的标记值
int T[10], Coins[10];
int dp[MAX_M];
int minCoins(int n,int m){//初始化dp数组,dp[i]表示金额i所需的最少硬币数for (int i = 0; i <= m; i++){dp[i] = INF;//默认无法达成}dp[0] = 0;for (int j = 0; j < n;j++){ //遍历各种硬币for (int count = 1; count <= Coins[j];count++){ //对每个金额,尝试不同数量该币for (int k = m; k >= T[j]; k--){ //金额递减if (dp[k - T[j] != INF]){ //表示之前的硬币组合已经可以得到金额 k - T[j],可用当前的硬币面值 T[j] 来更新金额 kdp[k] = (dp[k] < dp[k - T[j]] + 1) ? dp[k] : dp[k - T[j]] + 1;}}}}return dp[m] == INF ? -1 : dp[m];
}
int main(){FILE *input = fopen("input.txt","r");FILE *output = fopen("output.txt", "w");int n, m;fscanf(input, "%d", &n);for (int i = 0; i < n; i++){fscanf(input, "%d %d", &T[i], &Coins[i]); //读取硬币的面值和数量}fscanf(input, "%d", &m);int result = minCoins(n, m);fprintf(output, "%d\n", result);fclose(input);fclose(output);return 0;
}

相关文章:

动态规划经典例题:最长单调递增子序列、完全背包、二维背包、数字三角形硬币找零

一.最长单调递增子序列 设计一个O(n^2)时间的算法&#xff0c;找出由n个数组成的序列的最长单调递增子序列。 实验原理 状态转移方程&#xff08;递推公式&#xff09;&#xff1a; 对于每个 i&#xff0c;遍历之前的元素 j&#xff0c;如果 nums[j] < nums[i]&#xff0…...

最新得物小程序sign签名加密,请求参数解密,响应数据解密逆向分析

点击精选&#xff0c;出现https://app.dewu.com/api/v1/h5/index/fire/index 这个请求 直接搜索sign的话不容易定位 直接搜newAdvForH5就一个&#xff0c;进去再搜sign&#xff0c;打上断点 可以看到t.params就是没有sign的请求参数&#xff0c; 经过Object(a.default)该函数…...

Day2—3:前端项目uniapp壁纸实战

接下来我们做一个专题精选 <view class"theme"><common-title><template #name>专题精选</template><template #custom><navigator url"" class"more">More</navigator></template></common…...

SQL系列:常用函数

1、【MySQL】合并字段函数&#xff08;列转行&#xff09; 它可以将两个字段中的数据合并到一个字段中。 1&#xff09;CONCAT函数 CONCAT函数可以将多个字段中的数据合并到一个字段中。它的语法格式如下&#xff1a; SELECT CONCAT(字段1,字段2,...字段N) FROM 表名;SELEC…...

Python基于知识图谱的医疗问答系统【附源码、文档说明】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…...

yarn的三个资源调度策略

1. 容量调度器&#xff08;Capacity Scheduler&#xff09; 策略原理&#xff1a;将集群资源划分为多个队列&#xff0c;每个队列有固定的资源容量&#xff0c;且可以设置资源的最大和最小使用量。不同的用户或应用程序可以被分配到不同的队列中&#xff0c;在队列内部&#x…...

股指期货跨期套利是如何赚取价差利润的?

股指期货跨期套利&#xff0c;简单来说&#xff0c;就是在同一交易所内&#xff0c;针对同一股指期货品种的不同交割月份合约进行的套利交易。投资者会同时买入某一月份的股指期货合约&#xff0c;并卖出另一月份的股指期货合约&#xff0c;待未来某个时间点&#xff0c;再将这…...

w297毕业生实习与就业管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…...

Java集合框架中的List、Map、Set详解

在Java开发中&#xff0c;集合框架是处理数据时不可或缺的工具之一。今天&#xff0c;我们来深入了解一下Java集合框架中的List、Map和Set&#xff0c;并探讨它们的常见方法操作。 目录 一、List集合 1.1 List集合介绍 1.2 List集合的常见方法 添加元素 获取元素 修改元素…...

让机器学习更透明:使用 Python 开发可解释性模型工具包

友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…...

OpenStack Yoga版安装笔记(23)Swift安装

一、官方文档 Object Storage Install Guide — Swift 2.29.3.dev5 documentation 二、环境准备 之前的实验&#xff0c;已经有controller, compute1, block1节点&#xff0c;并已经完成Keystone、Glance、Nova、Neutron、Cinder等主要OpenStack Service的安装。 此处新增…...

MRO 工业品电商系统:智能精准匹配,快速满足采购需求

在竞争激烈的工业领域&#xff0c;企业对 MRO 工业品的采购需求越来越多。但传统 MRO 采购存在信息不透明、客户选型困难&#xff0c;流程复杂处理周期长、库存信息不明确、成本高和客户价格管理混乱等诸多问题。随着电商发展&#xff0c;MRO 工业品电商系统出现&#xff0c;给…...

2025年Q1数据安全政策、规范、标准以及报告汇总共92份(附下载)

一、政策演进趋势分析 &#xff08;一&#xff09;国家级政策新动向 数据要素市场建设 数据流通安全治理方案&#xff08;重点解析数据确权与交易规则&#xff09; 公共数据授权运营规范&#xff08;创新性提出分级授权机制&#xff09; 新兴技术安全规范 人工智能安全标准…...

基于Python Django 的全国房价大数据可视化系统(附源码,部署)

博主介绍&#xff1a;✌程序员徐师兄&#xff0c;7年大厂开发经验。全网粉丝12w&#xff0c;CSDN博客专家&#xff0c;同时活跃在掘金、华为云、阿里云、InfoQ等平台&#xff0c;专注Java技术和毕业项目实战分享✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&a…...

项目班——0408——qt的多线程开发

目录 一、并发、并行的概念 1. 并发 例子 2. 并行 二、qt的多线程开发 三、Qt多线程开发方法 1、可以使用QTthread 创建线程 来执行线程函数 2、可以借助moveToThread将对象转移到另一个线程中&#xff0c;然后执行 一、并发、并行的概念 1. 并发 多个任务在同一时间…...

每天学一个 Linux 命令(25):more

​​可访问网站查看,视觉品味拉满: http://www.616vip.cn/25/index.html 每天学一个 Linux 命令(25):more 命令简介 more 是一个经典的分页显示文本文件内容的命令行工具,适用于逐页浏览长文本文件。它简单易用,适合快速查看内容,但功能比 less 更为基础(不支持向后翻…...

那就聊一聊mysql的锁

MySQL 的锁机制是数据库并发控制的核心&#xff0c;作为 Java 架构师需要深入理解其实现原理和适用场景。以下是 MySQL 锁机制的详细解析&#xff1a; 一、锁的分类维度 1. 按锁粒度划分 锁粒度特点适用场景​全局锁​锁定整个数据库&#xff08;FLUSH TABLES WITH READ LOC…...

python(八)-数据类型转换

#数据类型转换 #转换为整型int #字符串str--》整数int #纯数字的字符串可以转换&#xff0c;否则会报错 s 2025 n int(s) print(type(s),type(n)) print(n)#浮点数float--》整数int s1 2.23 print(int(s1))#bool-->整数int s2,s3 True,False print(int(s2),int(s3))#转…...

Python语法系列博客 · 第7期[特殊字符] 列表推导式与字典推导式:更优雅地处理数据结构

上一期小练习解答&#xff08;第6期回顾&#xff09; ✅ 练习1&#xff1a;统计文件行数 with open("data.txt", "r", encoding"utf-8") as f:lines f.readlines()print(f"总行数&#xff1a;{len(lines)}")✅ 练习2&#xff1a;反…...

如何0基础学stm32?

如何0基础学stm32&#xff1f; 作为一个混迹嵌入式领域十余年的老兵&#xff0c;每次看到"0基础学STM32"这样的提问&#xff0c;我都忍不住想笑&#xff0c;又有些无奈。这就像问"如何0基础学开飞机"一样—虽然理论上可行&#xff0c;但过程恐怕没那么愉快…...

Cesium 加载 本地 b3dm 格式文件 并且 获取鼠标点击处经纬度 (亲测可用)

很奇怪cesium 里面只支持 相对路径 不支持绝对路径 我把 模型放在 /***/Cesium-1.128/Apps/SampleData/Cesium3DTiles/Tilesets 下面 "../../SampleData/Cesium3DTiles/Tilesets/terra_b3dms/tileset.json",所有源码 const viewer new Cesium.Viewer("cesiu…...

新能源汽车动力电池热管理方案全解析:开启电车续航与安全的密码

热管理&#xff1a;新能源汽车的隐形守护者 在新能源汽车飞速发展的今天&#xff0c;热管理系统作为保障车辆核心部件稳定运行的关键&#xff0c;正逐渐成为行业关注的焦点。据市场研究机构的数据显示&#xff0c;近年来新能源汽车的销量持续攀升&#xff0c;而与之相伴的是热…...

无需训练的具身导航探索!TRAVEL:零样本视觉语言导航中的检索与对齐

作者&#xff1a; Navid Rajabi, Jana Kosecka 单位&#xff1a;乔治梅森大学计算机科学系 论文标题&#xff1a;TRAVEL: Training-Free Retrieval and Alignment for Vision-and-Language Navigation 论文链接&#xff1a;https://arxiv.org/pdf/2502.07306 主要贡献 提出…...

C#测试linq中的左连接的基本用法

使用linq联表或者连接两个对象集合查询时一般使用的是join关键字&#xff0c;返回结果中包含两个表或两个对象集合中连接字段相等的数据记录&#xff0c;如果要实现sql语句中的左连接效果&#xff0c;并没有现成的left join关键字&#xff0c;此时可以使用DefaultIfEmpty 实现左…...

2025-04-19 Python 强类型编程

文章目录 1 方法标注1.1 参数与返回值1.2 变参类型1.3 函数类型 2 数据类型2.1 内置类型2.2 复杂数据结构2.3 类别选择2.4 泛型 3 标注方式3.1 注释标注3.2 文件标注 4 特殊情形4.1 前置引用4.2 函数标注扩展4.3 协变与逆变4.4 dataclass 5 高级内容5.1 接口5.2 泛型的协变/逆变…...

Java大模型MCP服务端开发-数据库查询与数据分析(附源码)

Java大模型MCP服务端开发-数据库查询 MCP服务器概述安装依赖服务端对象服务器传输服务器功能客户端测试源码地址MCP服务器概述 MCP服务器是模型上下文协议(MCP)架构中的基础组件,为客户端提供工具、资源和功能。它实现了协议的服务器端,负责: 暴露客户端可以发现和执行的工…...

spring-batch批处理框架(2)

文章目录 八、作业控制8.1 作业启动8.1.1 SpringBoot 启动8.1.2 Spring 单元测试启动8.1.3 RESTful API 启动 8.2 作业停止方案1&#xff1a;Step 步骤监听器方式方案2&#xff1a;StepExecution停止标记 8.3 作业重启8.3.1 禁止重启8.3.2 限制重启次数8.3.3 无限重启 九、Item…...

鸿蒙NEXT开发键盘工具类(ArkTs)

export declare type KeyboardCallBack (show: boolean, height: number) > void; import { AppUtil } from ./AppUtil; import { LogUtil } from ./LogUtil; import { ArrayUtil } from ./ArrayUtil;/*** 键盘工具类* author 鸿蒙布道师* since 2025/04/18*/ export class…...

动态规划算法的欢乐密码(一):斐波那契数模型

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、动态规划 二、例题讲解 2.1. 第 N 个泰波那契数 2.2. 三步问题 2.3. 使用最小花费爬楼梯 2.4. 解码方法 一、动态规划 动态规划是一种将复杂问题分解为更小的子问题&#xff0c;并利用子问题的解来…...

Echarts柱状图斜线环纹(图形的贴花图案)

单独设置 <!--此示例下载自 https://echarts.apache.org/examples/zh/editor.html?cbar-stack&codePYBwLglsB2AEC8sDeAoWszGAG0iAXMmuhgE4QDmFApqYQOQCGAHhAM70A0x6L7ACsAjQwtQqhIkwATxDUGbABaMAJsADu9HrAC-xHd3TZqNaCvEHiFcuaKTjAMzAMAzAFIu28hUXPY9ABYPQxIAI2AwTABbV…...