数据结构与算法学习笔记(Acwing 提高课)----动态规划·状态机模型
数据结构与算法学习笔记----动态规划·状态机模型
@@ author: 明月清了个风
@@ first publish time: 2025.5.20ps⭐️背包终于结束了,状态机模型题目不多。状态机其实是一种另类的状态表示方法,将某一个点扩展为一个状态进行保存并在多个状态之间转移,具体的来看题目理解吧。
Acwing 1049. 大盗阿福
阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。
这条街上一共有$N $家店铺,每家店中都有一些现金。阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,街上的报警系统才会启动,然后警察就会蜂拥而至。
作为一向谨慎作案的大盗,阿福不愿意冒着被警察追捕的风险行窃。他想知道,在不惊动警察的情况下,他今晚最多可以得到多少现金?
输入格式
输入的第一行是一个整数 T T T,表示一共有 T T T组数据。
接下来的每组数据,第一行是一个整数 N N N ,表示一共有N家店铺。第二行是 N N N个被空格分开的正整数,表示每一家店铺中的现金数量。每家店铺中的现金数量均不超过1000。
输出格式
对于每组数据,输出一行。该行包含一个整数,表示阿福在不惊动警察的情况下可以得到的现金数量。
数据范围
1 ≤ T ≤ 50 1 \le T \le 50 1≤T≤50,
1 ≤ N ≤ 100000 1 \le N \le 100000 1≤N≤100000
思路
很明显,这道题是一道线性的问题,题目并没有对抢劫的顺序有特殊的规定,因此可以从前往后。
对于状态表示而言,使用 f [ i ] f[i] f[i]表示抢劫前 i i i家店的最大收益。
然后就是状态划分,同样根据最后一步的选择进行,若不抢劫第 i i i家店铺,那就是 f [ i − 1 ] f[i - 1] f[i−1],若抢劫第 i i i家店铺,那么意味着第 i − 1 i - 1 i−1家店铺就无法选择了,因此相当于只能从前 i − 2 i - 2 i−2家店铺进行选择的最大值 f [ i − 2 ] + w [ i ] f[i - 2] + w[i] f[i−2]+w[i]。
但是上述分析其实在更新一个状态时,用到了前面两次的状态,下面考虑如何进行优化。
在上面的分析中,当仅用上一轮的状态也就是不知道第 i − 2 i - 2 i−2的状态,如果我们抢劫第 i i i家店铺的时候,无法知道在最优解中第 i − 1 i - 1 i−1家店铺是否被抢劫了,无法进行转移,因此引入状态机的表示方法,将所有状态表示为 f [ i ] [ 0 ] f[i][0] f[i][0]与 f [ i ] [ 1 ] f[i][1] f[i][1], 0 0 0表示当前店铺未选择, 1 1 1表示当前店铺被选择了,这样就将每个店铺的两个状态分开了,对于 f [ i ] [ 0 ] f[i][0] f[i][0],表示第 i i i个店铺没有被选择,因此可以从 f [ i − 1 ] [ 1 ] f[i - 1][1] f[i−1][1]或 f [ i − 1 ] [ 0 ] f[i - 1][0] f[i−1][0]转移过来;对于 f [ i ] [ 1 ] f[i][1] f[i][1],表示第 i i i个店铺被选择了,因此只能从 f [ i − 1 ] [ 0 ] f[i - 1][0] f[i−1][0]转移过来。
代码
#include <iostream>
#include <cstring>using namespace std;const int N = 10010, inf = 0x3f3f3f3f;int T;
int n;
int f[N][2];
int w[N];int main()
{cin >> T;while(T --){cin >> n;for(int i = 1; i <= n; i ++) cin >> w[i];f[0][0] = 0, f[0][1] = -0x3f3f3f3f;for(int i = 1; i <= n; i ++){f[i][0] = max(f[i - 1][0], f[i - 1][1]);f[i][1] = f[i - 1][0] + w[i];}cout << max(f[n][1], f[n][0]) << endl;}return 0;
}
Acwing 1057. 股票买卖 IV
给定一个长度为 N N N的数组,数组中的第 i i i个数字表示一个给定股票在第 i i i天的价格。
设计一个算法来计算你所能获取的最大利润,你最多可以完成 k k k笔交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。一次买入卖出合为一笔交易。
输入格式
第一行包含整数 N N N和 k k k,表示数组的长度以及你可以完成的最大交易笔数。
第二行包含 N N N个不超过 10000 10000 10000的非负整数,表示完整的数组。
输出格式
输出一个整数,表示最大利润。
数据范围
1 ≤ N ≤ 10 5 1 \le N \le 10^5 1≤N≤105,
1 ≤ k ≤ 100 1 \le k \le 100 1≤k≤100
思路
这道题很明显也可以看成两个状态,一个是手中有股票(已经买入了一个股票),另一个是手中没有股票(可以买入一个股票),那么状态的转移是:手中有股票时可以卖出不可以再次买入,也可以什么都不做;手中无股票时可以买入不可以卖出,也可以什么都不做。
当在某一天要卖出股票时,相当于获得这一天的权重 w [ i ] w[i] w[i];当要在某一天买入时,就要减去当天的权重 w [ i ] w[i] w[i]。
搞清楚题目的意思后,可以看状态表示了,使用 f [ i ] [ j ] [ 0 ] f[i][j][0] f[i][j][0]和 f [ i ] [ j ] [ 1 ] f[i][j][1] f[i][j][1]表示前 i i i天完成了 j j j笔交易且当前的状态为 0 0 0或 1 1 1。 0 0 0表示手中没有股票, 1 1 1表示手中有股票,也就是正在进行第 j j j次交易,属性就是集合的最大值。
那么对于状态转移, f [ i ] [ j ] [ 0 ] f[i][j][0] f[i][j][0]可以从 f [ i − 1 ] [ j ] [ 0 ] f[i - 1][j][0] f[i−1][j][0]走过来,也可以从 f [ i − 1 ] [ j ] [ 1 ] f[i - 1][j][1] f[i−1][j][1]转移过来,因此 f [ i ] [ j ] [ 0 ] = m a x ( f [ i − 1 ] [ j ] [ 0 ] , f [ i − 1 ] [ j ] [ 1 ] + w [ i ] ) f[i][j][0] = max(f[i - 1][j][0], f[i - 1][j][1] + w[i]) f[i][j][0]=max(f[i−1][j][0],f[i−1][j][1]+w[i]);对于 f [ i ] [ j ] [ 1 ] f[i][j][1] f[i][j][1]来说,其状态转移方程为 f [ i ] [ j ] [ 1 ] = m a x ( f [ i − 1 ] [ j ] [ 1 ] , f [ i − 1 [ j − 1 ] [ 0 ] ] − w [ i ] ) f[i][j][1] = max(f[i - 1][j][1], f[i - 1[j - 1][0]] - w[i]) f[i][j][1]=max(f[i−1][j][1],f[i−1[j−1][0]]−w[i]).
需要注意的是初始化状态,当交易次数为 0 0 0的时候,手中不可能持有股票,因此都为非法状态,需要进行标记,而交易次数为 0 0 0时,手中没有股票为合法状态,初始化为 0 0 0即可。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100010, M = 110;int n, m;
int w[N];
int f[N][M][2];int main()
{cin >> n >> m;for(int i = 1; i <= n; i ++) cin >> w[i];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 <= m; j ++){f[i][j][0] = max(f[i - 1][j][0], f[i - 1][j][1] + w[i]);f[i][j][1] = max(f[i - 1][j][1], f[i - 1][j - 1][0] - w[i]);}}int res = 0;for(int i = 1; i <= m; i ++) res = max(res, f[n][i][0]);cout << res << endl;return 0;
}
Acwing 1058. 股票买卖V
给定一个长度为 N N N的数组,数组中的第 i i i个数字表示一个给定股票在第 i i i天的价格。
设计一个算法来计算你所能获取的最大利润,在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一只股票)
- 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
- 卖出股票后,你无法在第二天买入股票(即冷却期为 1 1 1天)。
输入格式
第一行包含整数 N N N,表示数组长度。
第二行包含 N N N个不超过 10000 10000 10000的正整数,表示完整的数组。
输出格式
输出一个整数,表示最大利润。
数据范围
1 ≤ N ≤ 10 5 1 \le N \le 10^5 1≤N≤105,
思路
在这一题中添加了一个条件,在交易过后会有一天的冷冻期,因此变成了三个状态:手中有股票,手中没有股票的第一天,手中没有股票的第 ≥ 2 \ge 2 ≥2天。相当于把上一题中的第二个状态再次进行了分割。
这三个状态的转换关系如下:
手中有货可由手中有货转移而来,他可转移至手中无货的第一天(即第二种状态),手中无货的第一天只能向第三种状态进行转移;第三种状态可以转移到自身,也可转移到手中有货(即第一种状态)。
同样地,可以使用 f [ i ] [ 0 ] , f [ i ] [ 1 ] , f [ i ] [ 2 ] f[i][0],f[i][1],f[i][2] f[i][0],f[i][1],f[i][2]表示这三种状态,三种状态的转移方程如下:
f [ i ] [ 0 ] = m a x ( f [ i − 1 ] [ 0 ] , f [ i − 1 ] [ 2 ] − w [ i ] ) f[i][0] = max(f[i - 1][0], f[i - 1][2] - w[i]) f[i][0]=max(f[i−1][0],f[i−1][2]−w[i])
f [ i ] [ 1 ] = f [ i − 1 ] [ 0 ] + w [ i ] f[i][1] = f[i - 1][0] + w[i] f[i][1]=f[i−1][0]+w[i]
f [ i ] [ 2 ] = m a x ( f [ i − 1 ] [ 1 ] , f [ i − 1 ] [ 2 ] ) f[i][2] = max(f[i - 1][1], f[i - 1][2]) f[i][2]=max(f[i−1][1],f[i−1][2])
然后就是考虑初始化的问题,前两个状态在刚开始时都是非法状态,即 f [ 0 ] [ 0 ] , f [ 0 ] [ 1 ] f[0][0],f[0][1] f[0][0],f[0][1];只要将 f [ 0 ] [ 2 ] f[0][2] f[0][2]初始化为 0 0 0即可。
还有一个情况就是数据是单调下降的,也就是股票一直在跌,最优解就是什么都不做,因此最后的答案可能出现在 f [ n ] [ 1 ] f[n][1] f[n][1]与 f [ n ] [ 2 ] f[n][2] f[n][2]中。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100010, inf = 0x3f3f3f3f;int n;
int w[N];
int f[N][3];int main()
{cin >> n;for(int i = 1; i <= n; i ++) cin >> w[i];f[0][0] = f[0][1] = -inf;f[0][2] = 0;for(int i = 1; i <= n; i ++){f[i][0] = max(f[i - 1][0], f[i - 1][2] - w[i]);f[i][1] = f[i - ][0] + w[i];f[i][2] = max(f[i - 1][1], f[i - 1][2]);}cout << max(f[n][1], f[n][2]) << endl;return 0;
}
Acwing 1052. 设计密码
你现在需要设计一个密码 S S S, S S S需满足:
- S S S的长度是 N N N;
- S S S只包含小写英文字母;
- S S S不包含子串 T T T;
例如, a b c abc abc是 a b c d e abcde abcde的子串, a b d abd abd不是 a b c d e abcde abcde的子串。
请问共有多少种不同的密码满足要求?
由于答案会非常大,请输出答案模 10 9 + 7 10^9 + 7 109+7的余数。
输入格式
第一行包含整数 N N N,表示密码的长度。
第二行输入字符串 T T T, T T T中只包含小写字母。
输出格式
输出一个正整数,表示总方案数模 10 9 + 7 10^9 + 7 109+7后的结果。
数据范围
1 ≤ N ≤ 50 1 \le N \le 50 1≤N≤50,
1 ≤ ∣ T ∣ ≤ n 1 \le |T| \le n 1≤∣T∣≤n, ∣ T ∣ |T| ∣T∣是 T T T的长度。
思路
这一题要用到基础课中的 K M P KMP KMP算法,最好去复习一下,链接在这,它是一个字符串匹配算法,目的是为了尽可能多的利用已知的信息进行匹配。暴力匹配的两个字符串的最坏情况是 O ( n ∗ m ) O(n * m) O(n∗m),而 K M P KMP KMP算法可以将其降到 O ( n + m ) O(n + m) O(n+m)。具体来说, K M P KMP KMP算法的核心是 n e x t next next数组,其存有的信息代表着:当模式串与文本串匹配不成功时,模式串应该向右移动到什么位置,即跳过一步一步向右移动的过程。需要注意的是 n e x t next next数组是对模式串而言的,而不是对待匹配的文本串。
n e x t next next数组的具体定义是: n e x t [ i ] next[i] next[i]表示模式串 P [ 0 ⋯ i − 1 ] P[0\cdots i - 1] P[0⋯i−1]的最长公共前后缀的长度。
根据题意,我们需要使用 26 26 26个小写字母构造一个长度为 n n n的字符串 S S S,且 T T T不是字符串的子串,那么每一位密码有 26 26 26种选择,因此最坏就有 26 n 26^n 26n种方案。
为了使构造的密码 S S S中不包含字符创 T T T,那就意味着要使匹配的过程无法到达 T T T的最后一位.
首先先通过 K M P KMP KMP处理出模式串 T T T的 n e x t next next数组,对于这道题的状态表示,使用 f [ i ] [ j ] f[i][j] f[i][j]表示已经构造了前 i i i位,且与模式串 T T T匹配到了 j j j位(很明显, j j j不能到 m = s t r l e n ( T ) m = strlen(T) m=strlen(T))。
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>using namespace std;const int N =60, mod = 1e9 + 7;int n;
int ne[N];
char str[N];
int f[N][N];int main()
{cin >> n >> str + 1;for(int i = 2, j = 0; i <= n; i ++){while(j && str[i] != str[j + 1]) j = ne[j];if(str[i] == str[j + 1]) j ++;ne[i] = j;}f[0][0] = 1;for(int i = 0; i < n; i ++)for(int j = 0; j < m; j ++)for(char k = 'a'; k <= 'z'; k ++){int u = j;while(u && k != str[u + 1]) u = ne[u];if(k == str[u + 1]) u ++;f[i + 1][u] = (f[i + 1][u] + f[i][j]) % mod;}int res = 0;for(int i = 0; i < m; i ++) res = (res + f[n][i]) % mod;cout <<res << endl;return 0;
}
相关文章:
数据结构与算法学习笔记(Acwing 提高课)----动态规划·状态机模型
数据结构与算法学习笔记----动态规划状态机模型 author: 明月清了个风 first publish time: 2025.5.20 ps⭐️背包终于结束了,状态机模型题目不多。状态机其实是一种另类的状态表示方法,将某一个点扩展为一个状态进行保存并在多个状态之间转移…...

基于开源链动2+1模式AI智能名片S2B2C商城小程序的社群构建与新型消费迎合策略研究
摘要:随着个性化与小众化消费的崛起,消费者消费心理和模式发生巨大变化,社群构建对商家迎合新型消费特点、融入市场经济发展至关重要。开源链动21模式AI智能名片S2B2C商城小程序的出现,为社群构建提供了创新工具。本文探讨该小程序…...

高性能RPC框架--Dubbo(五)
Filter: filter过滤器动态拦截请求(request)或响应(response)以转换或使用请求或响应中包含的信息。同时对于filter过滤器不仅适合消费端而且还适合服务提供端。我们可以自定义在什么情况下去使用filter过滤器 Activa…...
计算机视觉与深度学习 | PSO-MVMD粒子群算法优化多元变分模态分解(Matlab完整代码和数据)
以下是一个基于PSO优化多元变分模态分解(MVMD)的Matlab示例代码框架,包含模拟数据生成和分解结果可视化。用户可根据实际需求调整参数。 %% 主程序:PSO优化MVMD参数 clc; clear; close all;% 生成模拟多变量信号 fs = 1000; % 采样频率 t = 0:1/fs:...

搭建自己的语音对话系统:开源 S2S 流水线深度解析与实战
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

feign调用指定服务ip端口
1 背景 在springcloud开发时候,同时修改了feign接口和调用方的代码,希望直接在某个环境调用修改的代码,而线上的服务又不希望被下线因为需要继续为其他访问页面的用户提供功能后端服务,有时候甚者包含你正在修改的功能。 2 修改…...

【深尚想!爱普特APT32F1023H8S6单片机重构智能电机控制新标杆】
在智能家电与健康器械市场爆发的今天,核心驱动技术正成为产品突围的关键。传统电机控制方案面临集成度低、开发周期长、性能瓶颈三大痛点,而爱普特电子带来的APT32F1023H8S6单片机无感三合一方案,正在掀起一场智能电机控制的技术革命。 爆款基…...
vue2 中的过滤器以及vue3中的替换方案
在 Vue 2 中,过滤器(filters) 是一种非常实用的语法糖,用于在模板中对数据进行格式化输出处理。我们来深入理解过滤器的原理、使用方式、最佳实践以及其局限性。 vue2 🧠 本质是什么? Vue 2 的过滤器是一…...

Unity EventCenter 消息中心的设计与实现
在开发过程中,想要传递信号和数据,就得在不同模块之间实现通信。直接通过单例调用虽然简单,但会导致代码高度耦合,难以维护。消息中心提供了一种松耦合的通信方式:发布者不需要知道谁接收事件,接收者不需要…...
瑞萨单片机笔记
1.CS for CC map文件中显示变量地址 Link Option->List->Output Symbol information 2.FDL库函数 pfdl_status_t R_FDL_Write(pfdl_u16 index, __near pfdl_u08* buffer, pfdl_u16 bytecount) pfdl_status_t R_FDL_Read(pfdl_u16 index, __near pfdl_u08* buffer, pfdl_…...
300. 最长递增子序列【 力扣(LeetCode) 】
文章目录 零、原题链接一、题目描述二、测试用例三、解题思路3.1 动态规划3.2 贪心 二分 四、参考代码4.1 动态规划4.2 贪心 二分 零、原题链接 300. 最长递增子序列 一、题目描述 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组…...

MySQL远程连接10060错误:防火墙端口设置指南
问题描述: 如果你通过本机服务器远程连接MySQL,出现10060错误,那可能是你的防火墙的问题 解决: 第一步:查看防火墙规则 通过以下命令查询,看ports是否开放了3306端口,目前只开放了22端口 f…...

使用 OpenCV 实现 ArUco 码识别与坐标轴绘制
🎯 使用 OpenCV 实现 ArUco 码识别与坐标轴绘制(含Python源码) Aruco 是一种广泛用于机器人、增强现实(AR)和相机标定的方形标记系统。本文将带你一步一步使用 Python OpenCV 实现图像中多个 ArUco 码的检测与坐标轴…...
2024CCPC辽宁省赛 个人补题 ABCEGJL
Dashboard - 2024 CCPC Liaoning Provincial Contest - Codeforces 过题难度 B A J C L E G 铜奖 4 953 银奖 6 991 金奖 8 1664 B: 模拟题 // Code Start Here string s;cin >> s;reverse(all(s));cout << s << endl;A:很…...
#6 百日计划第六天 java全栈学习
今天学的啥 上午 算法byd图论 图遍历dfs bfs 没学懂呵呵 找到两个良心up 图码 labuladong 看算法还好 尚硅谷讲的太浅了 那你问我 下午呢 下午 java 看了会廖雪峰的教程 回顾基础 小林coding Java基础八股文 还有集合的八股文 有的不是很懂 今天把Java基础算是完…...
AOP的代理模式
AOP的代理模式 1. AOP的实现方式 Spring AOP 主要通过两种动态代理技术实现: JDK动态代理:基于接口的代理,要求目标类必须实现至少一个接口。通过反射机制在运行时生成代理类(实现目标接口),并重写接口…...
解决leetcode第3548题.等和矩阵分割II
3548.等和矩阵分割II 难度:困难 问题描述: 给你一个由正整数组成的mxn矩阵grid。你的任务是判断是否可以通过一条水平或一条垂直分割线将矩阵分割成两部分,使得: 分割后形成的每个部分都是非空的。 两个部分中所有元素的和相…...
深入解析自然语言处理中的语言转换方法
在数字化浪潮席卷全球的今天,自然语言处理(Natural Language Processing,NLP)作为人工智能领域的核心技术之一,正深刻地改变着我们与机器交互的方式。其中,语言转换方法更是 NLP 的关键组成部分,…...
redis 进行缓存实战-18
使用 Redis 进行缓存 Redis 通常被认为只是一个数据存储,但它的速度和内存中特性使其成为缓存的绝佳选择。缓存是一种技术,通过将经常访问的数据存储在快速的临时存储位置来提高应用程序性能。通过使用 Redis 作为缓存,您可以显著减少主数据…...
JFace中MVC的表的单元格编辑功能的实现
一、实现流程 在JFace中实现MVC模式的表格编辑功能通常需要以下步骤: 1、启用编辑模式: 调用TableVierer对象的setCellModifier()方法,设置一个ICellModifier对象,以便在表格中启用编辑模式。实现ICellModifier接口的canModify(…...
在 Excel xll 自动注册操作 中使用东方仙盟软件2————仙盟创梦IDE
// 获取当前工作表名称string sheetName (string)XlCall.Excel(XlCall.xlfGetDocument, 7);// 构造动态名称(例如:Sheet1!MyNamedCell)string fullName $"{sheetName}!MyNamedCell";// 获取引用并设置值var namedRange (ExcelRe…...

canal实现mysql数据同步
目录 1、canal下载 2、mysql同步用户创建和授权 3、canal admin安装和启动 4、canal server安装和启动 5、java 端集成监听canal 同步的mysql数据 6、java tcp同步只是其中一种方式,还可以通过kafka、rabbitmq等方式进行数据同步 1、canal下载 canal实现mysq…...
解决 MySQL 表结构修改中锁定异常的全链路实战指南:从表结构设计到版本调优
引言 在 MySQL 中执行ALTER TABLE修改表结构(如新增字段、调整字段类型)时,锁定异常是最常见的阻碍。无论是 5.7 的 “锁等待超时”、8.0 的 “MDL 锁阻塞”,还是高并发下的 “长事务死锁”,本质都是表结构修改需要获…...
动态规划应用场景 + 代表题目清单(模板加上套路加上题单)
1. 序列型DP(Sequence DP) ✅ 应用场景 单个或多个序列(数组/字符串),求最优子结构。 常见问题:最长递增子序列、最长公共子序列、回文子序列。 🧠 套路总结 单序列:dp[i] max(…...

易境通专线散拼系统:全方位支持多种专线物流业务!
在全球化电商快速发展的今天,跨境电商物流已成为电商运营中极为重要的环节。为了确保物流效率、降低运输成本,越来越多的电商卖家选择专线物流服务。专线物流作为五大主要跨境电商物流模式之一,通过固定的运输路线和流程,极大提高…...
nvm版本管理下pnpm 安装失败问题解决
检查当前使用的 Node.js 是否由 nvm 管理 nvm current 应显示类似 18.16.0 这样的版本号,而不是 system。如果是 system,说明你正在使用系统中其他位置的 Node.js 而不是 nvm 管理的版本。 切换回 nvm 管理的版本 nvm use 18.16.0清除 npm 缓存和全局安装…...
C++高频面试考点 -- 智能指针
C高频面试考点 – 智能指针 C11中引入智能指针的概念,方便堆内存管理。这是因为使用普通指针,容易造成堆内存泄漏,二次释放,程序发生异常时内存泄漏等问题。 智能指针在C11版本之后提供,包含在头文件<memory>中…...

06 如何定义方法,掌握有参无参,有无返回值,调用数组作为参数的方法,方法的重载
1.调用方法 2.掌握有参函数 3.调用数组作为参数 一个例题:数组参数,返回值 方法的重载 两个例题:冒泡排序和九九乘法表的格式学习...

使用vscode MSVC CMake进行C++开发和Debug
使用vscode MSVC CMake进行C开发和Debug 前言软件安装安装插件构建debuug方案一debug方案二其他 前言 一般情况下我都是使用visual studio来进行c开发的,但是由于python用的是vscode,所以二者如果统一的话能稍微提高一点效率。 软件安装 需要安装的软…...
C# AutoMapper对象映射详解
引言 在现代软件开发中,特别是采用分层架构的应用程序,我们经常需要在不同的对象类型之间进行转换。例如,从数据库实体(Entity)转换为数据传输对象(DTO),或者从视图模型(…...