动态规划之简单多状态
简单多状态
- 1. 按摩师(easy)
- 2. 打家劫舍II (medium)
- 3. 删除并获得点数(medium)
- 4. 买卖股票的最佳时机含冷冻期(medium)
- 5. 买卖股票的最佳时机III(hard)
1. 按摩师(easy)
1.题目链接:按摩师
2.题目描述:一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
示例 1:
输入: [1,2,3,1]
输出: 4 解释: 选择 1 号预约和 3 号预约,总时长 = 1 + 3 = 4。
示例 2:
输入: [2,7,9,3,1]
输出: 12 解释: 选择 1 号预约、 3 号预约和 5 号预约,总时长 = 2 + 9 + 1 = 12。
示例 3:
输入: [2,1,4,5,3,1,1,3]
输出: 12 解释: 选择 1 号预约、 3 号预约、 5 号预约和 8 号预约,总时长 = 2 + 4 + 3 + 3 = 12。
3.问题分析:
对于动态规划多状态这类问题,看完题目后,对于某个事物,有明显几个状态;比如这道题的事物就是这个按摩师,这个按摩师可能有工作,休息两种状态,而我们要做的就是将这两种状态表示出来,然后计算不同状态下他所能达到的值。 最后依据题目来求解最大值还是最小值。
- 状态表示:先用一个dp[n]进行表示,然后就会发现,对于某一个位置来说,这个位置的客人可能选,可能不选(不选可能就是在休息),那么很明显用一个dp表是不能表示出这两种状态的。所以状态表示可以如下:f[i] 表⽰:选择到 i 位置时, nums[i] 必选,此时的最⻓预约时⻓; g[i] 表⽰:选择到 i 位置时, nums[i] 不选,此时的最⻓预约时⻓。
- 状态转移方程:对于f[i]数组来说,选择到 i 位置时, nums[i] 必选,此时的最⻓预约时⻓,所以如果i位置必选,那么i-1就不能再选,刚好g[i] 表示的就是 nums[i] 不选,此时的最⻓预约时,此时f[i]=nums[i] + g[i-1]; g[i]表示i位置不选,那么i-1可以选也可以不选,取这两者最大值,g[i]=max(f[i-1], g[i-1])。 所以状态表示分别为
f[i] = nums[i] + g[i - 1];g[i] = max(f[i - 1], g[i - 1]);
- 初始化:对于f[i]来说,i位置表示必选,所以
f[0]=nums[0]
;对于g[i]来说,i位置表示不选,所以g[0]=0
。 - 填表顺序:根据状态转移⽅程得从左往右,两个表⼀起填。
- 返回值:根据状态表⽰,应该返回
max(f[n - 1], g[n - 1])
。
代码如下:
class Solution
{
public:int massage(vector<int>& nums) {int n = nums.size();//判断是否为空if (n == 0)return 0;vector<int> f(n), g(n);//初始化f[0] = nums[0];for (int i = 1; i < n; ++i){f[i] = nums[i] + g[i - 1];g[i] = max(f[i - 1], g[i - 1]);}return max(f[n - 1], g[n - 1]);}
};
2. 打家劫舍II (medium)
1.题目链接:打家劫舍II
2.题目描述:你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。
示例 1:
输入:nums = [2,3,2]
输出:3 解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2),因为他们是相邻的。
示例 2:
输入:nums = [1,2,3,1]
输出:4 解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。
示例 3:
输入:nums = [1,2,3]
输出:3
3.问题分析:
这道题上道题的区别就是将这个nums数组看作是一个环形数组,这样的话就需要考虑临界区,也就是对首尾的状况进行分析;具体有如下几种:如果第一个位置选,那么最后一个位置就不能选,也就是在区间[0,n - 2];如果最后一个位置选,那么第一个位置就不能选,也就是区间[1,n - 1]。 还有没有别的情况?没有了。然后对两个区间[0,n - 2]和[1,n - 1]
分别进行一次按摩师的问题,就可以求出最大值。
- 状态表示:f[i] 表⽰:选择到 i 位置时, nums[i] 必选,此时偷取利润的最大值; g[i] 表⽰:选择到 i 位置时, nums[i] 不选,此时偷取利润的最大值。
- 状态转移方程:如按摩师的分析方式,状态转移方程如下:
f[i] = nums[i] + g[i - 1];g[i] = max(f[i - 1], g[i - 1]);
- 初始化:对于f[i]来说,i位置表示必选,所以
f[0]=nums[0]
;对于g[i]来说,i位置表示不选,所以g[0]=0
。 - 填表顺序:根据状态转移⽅程得从左往右,两个表⼀起填。
- 返回值:根据状态表⽰,应该返回
max(f[n - 1], g[n - 1])
。
代码如下:
class Solution
{
public:int _rob(vector<int>& nums, int left, int right){if (left > right)return 0;int n = nums.size();vector<int> f(n), g(n);//初始化第一个值f[left] = nums[left];for (int i = left + 1; i <= right; ++i){f[i] = nums[i] + g[i - 1];g[i] = max(f[i - 1], g[i - 1]);}return max(f[right], g[right]);}int rob(vector<int>& nums) {int n = nums.size();//判断临界条件if (n == 1)return nums[0];//分别求出两个区间[0,n - 2]和[1,n - 1]的最大值return max(_rob(nums, 0, n - 2), _rob(nums, 1, n - 1));}
};
3. 删除并获得点数(medium)
1.题目链接:删除并获得点数
2.题目描述:
给你一个整数数组 nums ,你可以对它进行一些操作。
每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1
的元素。
开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
示例 1:
输入:nums = [3,4,2]
输出:6 解释: 删除 4 获得 4 个点数,因此 3 也被删除。 之后,删除 2 获得 2个点数。总共获得 6 个点数。
示例 2:
输入:nums = [2,2,3,3,3,4]
输出:9 解释: 删除 3 获得 3 个点数,接着要删除两个 2 和 4 。 之后,再次删除3 获得 3 个点数,再次删除 3 获得 3 个点数。 总共获得 9 个点数。
提示:
1 <= nums.length <= 2 * 10^4
1 <= nums[i] <= 10^4
3.问题分析:
这道题就需要很好的理解能力了,大概意思是给你一个数组,然后你可以删除一个元素并获得它的大小(这里就叫做点数),但是你如果删除了某个数,比如5,那么你就不能再删除数组中的3和4(上述加红区域)。看到这会想到什么??是不是就和上述第一题差不多了,i位置必选的话,i-1与i+1位置就不能再选。然后就需要一些操作,将本题变为与上述题一样的解法即可,思路如下:由提示可知道1 <= nums[i] <= 10^4,所以用一个10001大小的数组将数据管理起来,下标对应的就是每个数据,所存的元素表示该下标总共的和(例如4出现3次,那么4的位置所存的数据就为12)。
- 状态表示:如上题一样,用f[i]表示i位置删除,所获取的最大点数;g[i]表示i位置不删除,所获取的最大点数。
- 状态转移方程:如按摩师的分析方式,状态转移方程如下:
f[i] = hash[i] + g[i - 1];g[i] = max(f[i - 1], g[i - 1]);
- 初始化:对于f[0]位置来说,必选后值为0。
- 填表顺序:从左往右,两表一次填写。
- 返回值:max(f[N - 1], g[N - 1])。
代码如下:
class Solution
{
public:int deleteAndEarn(vector<int>& nums) {const int N = 10001;int hash[N] = { 0 };for (auto& x : nums)hash[x] += x;vector<int> f(N), g(N);for (int i = 1; i < N; ++i){f[i] = hash[i] + g[i - 1];g[i] = max(f[i - 1], g[i - 1]);}return max(f[N - 1], g[N - 1]);}
};
4. 买卖股票的最佳时机含冷冻期(medium)
1.题目链接:买卖股票的最佳时机含冷冻期
2.题目描述:给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: prices = [1,2,3,0,2]
输出: 3 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
示例 2:
输入: prices = [1]
输出: 0
提示:
1 <= prices.length <= 5000
0 <= prices[i] <= 1000
3.问题分析:
这类题先分状态,然后对每种状态再进行详细讨论。如本题状态该怎么分?在某一天的交易状态可能为买入、冷冻期,冷冻期之后为可交易状态(可交易状态是需要自行找出的)因为卖出的那一刻和进入冷冻期的利润相同,所以买卖股票问题不需要关心卖出状态(如果考虑卖出状态的话,要记得冷冻期的利润是和当天卖出状态利润相同的)。
- 状态表示:由于有「买⼊」「可交易」「冷冻期」三个状态,因此我们可以选择⽤三个数组,其中:
dp[0][j] 表⽰:第 i 天结束后,处于「买⼊」状态,此时的最⼤利润;dp[1][j] 表⽰:第 i 天结束后,处于「冷冻期」状态,此时的最⼤利润;dp[2][j] 表⽰:第 i 天结束后,处于「可交易」状态,此时的最⼤利润
。 - 状态转移方程:由下图进行分析:
箭头末尾表示昨天,箭头前端表示今天。nothing表示什么也不用做。 由买入状态开始分析:由买入能不能到买入状态?什么也不干就可以,由买入到冷冻期?昨天卖出,今天就到冷冻期 ,由买入到可交易?买入后只能卖出到冷冻期,所以不可行。 冷冻期状态:由冷冻期到冷冻期?不行,由冷冻期到买入,显而易见也不行,由冷冻期到可交易?昨天冷冻期,什么也不干,今天就能到达可交易。可交易状态:由可交易到可交易?昨天可交易状态什么也不干,今天就又是可交易状态,由可交易到买入?昨天可交易,今天当然可以买入,由可交易到冷冻期?不行。
所以状态转移方程如下:dp[0][j] = max(dp[0][j - 1], dp[2][j - 1] - prices[j]); dp[1][j] = dp[0][j - 1] + prices[j]; dp[2][j] = max(dp[2][j - 1], dp[1][j - 1]);
- 初始化:三种状态都会⽤到前⼀个位置的值,因此需要初始化每⼀⾏的第⼀个位置:
dp[0][0] :此时要想处于「买⼊」状态,必须把第⼀天的股票买了,因此 dp[0][0] = -prices[0] ;
dp[1][0] :啥也不⽤⼲即可,因此 dp[1][0] = 0 ;
dp[2][0] :⼿上没有股票,买⼀下卖⼀下就处于冷冻期,此时收益为 0 ,因此 dp[2][0] = 0 。 - 填表顺序:从上到下,从左往右,三个表⼀起填。
- 返回值:买入状态的利润肯定不是最大的,所以返回冷冻期状态或可交易状态的最大值即可。
代码如下:
class Solution
{
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(3, vector<int>(n));dp[0][0] = -prices[0];for (int j = 1; j < n; ++j){dp[0][j] = max(dp[0][j - 1], dp[2][j - 1] - prices[j]);dp[1][j] = dp[0][j - 1] + prices[j];dp[2][j] = max(dp[2][j - 1], dp[1][j - 1]);}return max(dp[1][n - 1], dp[2][n - 1]);}
};
5. 买卖股票的最佳时机III(hard)
1.题目链接:买卖股票的最佳时机III
2.题目描述:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔(k笔) 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入:prices = [3,3,5,0,0,3,1,4]
输出:6 解释:在第 4 天(股票价格 = 0)的时候买入,在第6天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。
随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。
示例 2:
输入:prices = [1,2,3,4,5]
输出:4 解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这个情况下, 没有交易完成, 所以最大利润为 0。
示例 4:
输入:prices = [1]
输出:0
提示:
1 <= prices.length <= 10^5
0 <= prices[i] <= 10^5
3.问题分析:
这道题与上道题相比,多需要考虑一个交易次数,所以需要再增加一个维度用来表示交易次数。对于状态来说,只有买入状态和可交易状态,所以用f,g两个数组来进行表示,第二个维度j表示的就是交易次数。
- 状态表示:
f[i][j] 表⽰:第 i 天结束后,完成了 j 次交易,处于「买⼊」状态,此时的最⼤利润; g[i][j] 表⽰:第 i 天结束后,完成了 j 次交易,处于「卖出」状态,此时的最⼤利润。
- 状态转移⽅程:
对于 f[i][j] ,有两种情况到这个状态:
在 i - 1 天的时候,交易了 j 次,处于「买⼊」状态,第 i 天啥也不⼲即可。此时最⼤利润为: f[i - 1][j] ;在 i - 1 天的时候,交易了 j 次,处于「卖出」状态,第 i 天的时候把股票买了。此时的最⼤利润为: g[i - 1][j] - prices[i] 。综上,所求的是「最⼤利润」,因此是两者的最⼤值: f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]) 。
对于 g[i][j] ,有两种情况可以到达这个状态:
在 i - 1 天的时候,交易了 j 次,处于「卖出」状态,第 i 天啥也不⼲即可。此时的最⼤利润为: g[i - 1][j] ;在 i - 1 天的时候,交易了 j - 1 次,处于「买⼊」状态,第 i 天把股票卖了,然
后就完成了 j ⽐交易。此时的最⼤利润为: f[i - 1][j - 1] + prices[i] 。但是这个状态不⼀定存在,要先判断⼀下。要求的是最⼤利润,因此状态转移⽅程为:g[i][j] = g[i - 1][j]; if(j >= 1) g[i][j] = max(g[i][j], f[i - 1][j - 1] + prices[i]);
- 初始化:
由于需要⽤到 i = 0 时的状态,因此初始化第⼀⾏即可。
当处于第 0 天的时候,只能处于「买⼊过⼀次」的状态,此时的收益为 -prices[0] ,因此 f[0][0] = - prices[0] 。
为了取 max 的时候,⼀些不存在的状态「起不到⼲扰」的作⽤,我们统统将它们初始化为 -INF (⽤ INT_MIN 在计算过程中会有「溢出」的⻛险,这⾥ INF 折半取0x3f3f3f3f ,⾜够⼩即可)溢出情况:当初始化为负无穷时,-prices[0]-oo就会溢出。 - 填表顺序:从上往下填每⼀⾏,每⼀⾏从左往右,两个表⼀起填。
- 返回值:返回每次交易的最大值。
代码如下:
class Solution {
public:const int INF = 0x3f3f3f3f;int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> f(n, vector<int>(3, -INF)), g(n, vector<int>(3, -INF));f[0][0] = -prices[0], g[0][0] = 0;for (int i = 1; i < n; ++i) {for (int j = 0; j < 3; ++j){f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]);if (j >= 1) //防止越界g[i][j] = max(g[i - 1][j], f[i - 1][j - 1] + prices[i]);else g[i][j] = g[i - 1][j];}}int ret = 0;for (int j = 0; j < 3; ++j)ret = max(ret, g[n - 1][j]);return ret;} } ;
对于买卖股票的最佳时机IV问题来说,交易k次,分析方式与上道题基本无异,只需将上述代码中的3改为k即可。
相关文章:

动态规划之简单多状态
简单多状态 1. 按摩师(easy)2. 打家劫舍II (medium)3. 删除并获得点数(medium)4. 买卖股票的最佳时机含冷冻期(medium)5. 买卖股票的最佳时机III(hard) 1. 按…...

跨数据中心Multi-Fabric解决方案:L2和L3网络的高效连接和扩展
云数据中心里,为什么需要DCI互通? 云化数据中心,网络资源通过虚拟化技术形成资源池,实现业务与物理网络解耦,通过网络虚拟化,物理网络资源可以被分成多个虚拟网络资源,从而提高网络资源的使用效…...

upload-labs靶场通关详解
文章目录 Pass-01Pass-02Pass-03Pass-04Pass-05Pass-06Pass-07Pass-08Pass-09Pass-10Pass-11Pass-12Pass-13Pass-14Pass-15Pass-16Pass-17Pass-18Pass-19Pass-20方法一(文件夹名欺骗绕过)方法二(%00截断攻击) Pass-21 Pass-01 绕过…...

Leetcode刷题笔记--Hot41-50
1--二叉树的层序遍历(102) 主要思路: 经典广度优先搜索,基于队列; 对于本题需要将同一层的节点放在一个数组中,因此遍历的时候需要用一个变量 nums 来记录当前层的节点数,即 nums 等于队列元素的…...

「MySQL-02」数据库的操纵、备份、还原和编码规则
目录 一、库操作 1. 创建数据库 2. 查看所有数据库 3. 删除数据库 4. 修改数据库 5. 进入一个数据库 二、查看和设置数据库的编码规则 1. MySQL的两个编码规则:字符集和校验规则 2. 查看MySQL当前使用的字符集以及校验规则 3. 查看MySQL支持的所有字符集 4. 查看MyS…...

Effective C++条款24——若所有参数皆需类型转换,请为此采用non-member涵数(设计与声明)
我在导读中提过,令classes支持隐式类型转换通常是个糟糕的主意。当然这条规则有其例外,最常见的例外是在建立数值类型时。假设你设计一个class用来表现有理数,允许整数“隐式转换”为有理数似乎颇为合理。的确,它并不比C内置从int…...

决策工具箱:战略分析必备工具与框架
跟随时代的步伐,企业战略也在不断演化。无论是初创企业还是知名企业,都需要有效的战略工具来指导其业务发展。探索这些必备工具,并学习如何最大限度地利用它们,是企业的一个学习目标。 战略分析工具和框架有很多,其中…...

【压力测试指南】没有任何文档,小白也可以做的压力测试
前言 一般在执行压力测试之前,会由开发提供出接口文档,包含一些接口的详细参数,便于测试工程师编写测试脚本。但在某些情况下,接口等相关文档缺失,那作为Tester,我们该如何顺利的实施压力测试呢࿱…...

Linux: memory: memblock: debug
文章目录 代码memblock=debug实例log代码 将内存相关的一些日志打开: static int __init early_memblock(char *p) {if (p && strstr(p, "debug")...

搬家快递服务小程序的便利性
在当今快节奏的生活中,搬家可能是很多人都需要面对的问题。无论是新房子还是新办公室,都需要高效、便捷的搬家服务。本文将介绍如何使用第三方小程序制作平台,如乔拓云平台,开发一款高效便捷的搬家服务小程序。 1. 注册登录第三方…...

软件架构师 Debugging
软件架构师 Debugging 目录概述需求: 设计思路实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survi…...

7.1 项目1 学生通讯录管理:文本文件增删改查(C++版本)(自顶向下设计+断点调试) (A)
C自学精简教程 目录(必读) 作业目标: 这个作业中,你需要综合运用之前文章中的知识,来解决一个相对完整的应用程序。 作业描述: 1 在这个作业中你需要在文本文件中存储学生通讯录的信息,并在程序启动的时候加载这些…...

学习使用php判断阿里云oss图片单图或批量上传、查询图片文件是否存在
学习使用php判断阿里云oss图片单图或批量上传、查询图片文件是否存在 doesObjectExist doesObjectExist 主要函数doesObjectExist /*** Base64上传文件* param string|array $images* param string $model_path* param string $model_type* param string $upload_path* param…...

重磅| Falcon 180B 正式在 Hugging Face Hub 上发布!
引言 我们很高兴地宣布由 Technology Innovation Institute (TII) 训练的开源大模型 Falcon 180B 登陆 Hugging Face! Falcon 180B 为开源大模型树立了全新的标杆。作为当前最大的开源大模型,有180B 参数并且是在在 3.5 万亿 token 的 TII RefinedWeb 数…...

Linux命令行
目录 CLI GUI 命令行界面 图形界面 命令行提示符 # $ 编辑 命令一般由三个部分组成 历史命令,使用上下键,或者使用history,ctrlr搜索历史命令 通配符 *,? 切换用户 su 作业管理 &,jobs,bg,fg CLI GUI 命令行界面 …...

[持续更新]计算机经典面试题基础篇Day1
[通用]计算机经典面试题基础篇Day1 1、jvm的组成 类加载器(Class Loader):负责将编译后的Java类加载到JVM中,并在运行时动态加载所需的类。运行时数据区(Runtime Data Area):是JVM的内存管理区…...

ProcessWindowFunction 结合自定义触发器的陷阱
背景: flink中常见的需求如下:统计某个页面一天内的点击率,每10秒输出一次,我们如果采用ProcessWindowFunction 结合自定义触发器如何实现呢?如果这样实现问题是什么呢? ProcessWindowFunction 结合自定义触发器实现…...

什么是jvm
一、初识JVM(虚拟机) JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Jav…...

kettle通过java步骤获取汉字首拼
kettle通过java步骤获取汉字首拼 用途描述 一组数据,需要获取汉字首拼后,输出; 实现效果 添加jar包 pinyin4j-2.5.0.jar 自定义常量数据 Java代码 完整代码: import net.sourceforge.pinyin4j.PinyinHelper; import net.sou…...

Conformer: Local Features Coupling Global Representationsfor Visual Recognition
论文链接:https://arxiv.org/abs/2105.03889 代码链接:https://github.com/pengzhiliang/Conformer 参考博文:Conformer论文以及代码解析(上)_conformer代码_从现在开始壹并超的博客-CSDN博客 摘要 在卷积神经网络…...

java8-Stream流常用API
什么是 Stream Stream(流)是 Java 8 引入的一个新的抽象概念,它代表着一种处理数据的序列。简单来说,Stream 是一系列元素的集合,这些元素可以是集合、数组、I/O 资源或者其他数据源。 Stream API 提供了丰富的操作方…...

React 任务调度
React 任务池 不同的fiber任务有不同的优先级,为了用户体验,React需要先处理优先级高的任务。 为了存储这些任务,React中有两个任务池: // Tasks are stored on a min heap var taskQueue []; // 存储立即要执行的任务 var tim…...

小白开始学习C++
第一节:控制台输出hello word! #include<iostream> //引入库文件 int main() { //控制台输出 hello word! 之后回车 std::cout << "hello word!\n"; #include<iostream> //引入库文件int main() {//控制…...

SpringMVC入门的注解、参数传递、返回值和页面跳转---超详细教学
前言: 欢迎阅读Spring MVC入门必读!在这篇文章中,我们将探索这个令人兴奋的框架,它为您提供了一种高效、灵活且易于维护的方式来构建Web应用程序。通过使用Spring MVC,您将享受到以下好处:简洁的代码、强大…...

【复习socket】每天40min,我们一起用70天稳扎稳打学完《JavaEE初阶》——28/70 第二十八天
专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示:思路以及想法★✔ 如果大家觉得有帮助的话,感谢大家帮忙 点…...
vue2踩坑之项目:生成二维码使用vue-print-nb打印二维码
1. vue2安装 npm install vue-print-nb --save vue3安装 npm install vue3-print-nb --save 2. //vue2 引入方式 全局 main.js import Print from vue-print-nb Vue.use(Print) ------------------------------------------------------------------------------------ //vue2 …...

【iVX】十五分钟制作一款小游戏,iVX真有怎么神?
个人主页:【😊个人主页】 新人博主,喜欢就关注一下呗~ 文章目录 前言iVX介绍初上手布置背景制作可移动物体总结(完善步骤) 前言 在上篇文章中,我向大家介绍了一种打破常规的编程方式——iVX,可…...

SpringMVC常用注解、参数传递、返回值
目录 前言 一、常用注解 二、参数传递 编辑 1. 基础类型String类型 2. 复杂类型 3. RequestParam 4. PathVariable 5.RequestBody 6. RequestHeader 三、方法返回值 一:void 二:String 三:Stringmodel 四:ModelAndVi…...

新公司第一次上架新APP需要提前准备哪些材料?
目录 前言一、需要上架的应用市场二、需要准备的资料总结 前言 前不久,使用一家新公司刚刚上架了一款新的APP项目。特此记录一下,现在第一次上架一款APP需要提前准备的各项材料。 一、需要上架的应用市场 现在,上架一款新的APP主流的应用市…...

『C语言进阶』指针进阶(一)
🔥博客主页: 小羊失眠啦 🔖系列专栏: C语言 🌥️每日语录:无论你怎么选,都难免会有遗憾。 ❤️感谢大家点赞👍收藏⭐评论✍️ 前言 在C语言初阶中,我们对指针有了一定的…...