动态规划:两个数组的dp问题(C++)
动态规划:两个数组的dp问题
- 前言
- 两个数组的dp问题
- 1.最长公共子序列(中等)
- 2.不同的子序列(困难)
- 3.通配符匹配(困难)
- 4.正则表达式(困难)
- 5.交错字符串(中等)
- 6.两个字符串的最小ASCII删除和(中等)
- 7.最长重复子数组(中等)
 
 
前言
动态规划往期文章:
- 动态规划入门:斐波那契数列模型以及多状态
- 动态规划:路径和子数组问题
- 动态规划:子序列问题
- 动态规划:回文串问题
两个数组的dp问题
1.最长公共子序列(中等)
链接:最长公共子序列
-  题目描述 
  
-  做题步骤 
-  状态表示 
 对于两个数组的dp,采用一维dp是没有办法清晰的表示状态的,故对于两个数组的dp我们通常采用二维数组。
 故定义状态表示为dp[i] [j]:s1的[0,i]区间和s2的[0,j]区间之间的最长公共子序列。
-  状态转移方程 
 对s1的[0,i]区间和s2的[0,j]区间,我们分情况讨论:
 (1)s1[i] == s2[j],我们只需要知道s1的[0,i - 1]区间和s2的[0,j - 1]区间之间的最长公共子序列,然后加一即可,即dp[i] [j] = dp[i - 1] [j - 1] + 1。(比如s1 = "abc"和s2 = “akc”,就是"ab"和"ak"的最长公共子序列加1)
 (2)s1[i] != s2[j],这个这时最长公共子序列⼀定不会同时以s1[i]和s2[j]结尾。
 ①有可能以s2[j]结尾,去s1的 [0, i - 1]以及s2的 [0, j] 区间内找:此时最大长度为dp[i - 1] [j]。(比如s1 = “ack”,s2 = “bc”)
 ②有可能以s1[i]结尾,去s1的[0, i]以及s2的 [0, j - 1] 区间内找:此时最大长度为dp[i] [j - 1]。(比如s1 = “ac”,s2 = “cb”)
 ③也有可能两者都不是结尾,但这个情况是包括在前两个情况中的,一定小于等于前两者。(比如s1 = “acd”,s2 = “aca”)
 故对于(2)情况,dp[i] [j] = max(dp[i - 1] [j], dp[i] [j - 1])。
-  初始化 

-  填表顺序 
 参照上面的图,填表顺序为行从上到下,每一行从左到右。
-  返回值 
 依据状态表示,返回值为dp[m] [n](m,n分别为s1、s2长度)。
- 代码实现
class Solution {
public:int longestCommonSubsequence(string s1, string s2) {int m = s1.size(), n = s2.size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));//处理下标映射s1 = " " + s1, s2 = " " + s2;for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){         if(s1[i] == s2[j])dp[i][j] =  dp[i - 1][j - 1] + 1;         elsedp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);               }     return dp[m][n];}
};
2.不同的子序列(困难)
链接:不同的子序列
-  题目描述 
  
-  做题步骤 
-  状态表示 
 这个题目虽然标的是困难,但是有前面的做题经验其实还好。
 对这种问题,我们采用二维表,定义状态表示为dp[i] [j]:t的[0, j]区间在s的[0, i]区间出现的方案个数。
-  状态转移方程 
 对s的[0,i]区间和t的[0,j]区间,我们分情况讨论:
 (1)s[i] == t[j]:
 ①比如t = "rab"和s = “rabcb”,第一种同时选s[i]、t[j]为结尾,这个时候的方案数为t的[0, j - 1]区间在s的[0, i - 1]区间出现的方案数(ra在rabc中出现的次数),即dp[i - 1] [j - 1]。
 ②第二种是不同时选s[i]、t[j]为结尾,这个时候的方案数为t的[0, j]区间在s的[0, i - 1]区间出现的方案数(t = "rab"在s的"rabc"中出现的次数),即dp[i - 1] [j]。
 两种都符合要求:故(1)情况dp[i] [j] = dp[i - 1] [j] + dp[i - 1] [j - 1]
 (2)s[i] != t[j]:
 这个时候只有一种选择,即(1)的②情况,故(2)情况dp[i] [j] = dp[i - 1] [j] 。
-  初始化 
 这个题目的初始化和上一题相似,多开一行一列,把多的一行一列当作空串。其中当t为空串时在s中一定有一种方案(s也拿一个空串出来),故初始化第一列为1。
-  填表顺序 
 填表不明白参考第一题,填表顺序为行从上到下,每一行从左到右。
-  返回值 
 依据状态表示,返回值为dp[m] [n](m,n分别为s、t长度)。
- 代码实现
class Solution {
public:int numDistinct(string s, string t) {int m = s.size(), n = t.size();//这个题目中间填表的时候会溢出,而且溢的不是一点点//不过溢出的部分不影响结果,用uint即可vector<vector<unsigned int>> dp(m + 1, vector<unsigned int>(n + 1));s = " " + s, t =  " " + t;  //处理下标映射for(int i = 0; i < m; i++)  dp[i][0] = 1;for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){dp[i][j] = dp[i - 1][j];if(s[i] == t[j])  //s[i] == t[j]会多一种选择dp[i][j] += dp[i - 1][j - 1];                         }return dp[m][n];}
};
3.通配符匹配(困难)
链接:通配符匹配
-  题目描述 
  
-  做题步骤 
-  状态表示 
 依据前面的做题经验,我们定义一个二维表,定义状态表示为dp[i] [j]:p的[0, j]区间能否匹配s的[0, i]区间。
-  状态转移方程 
 对s的[0,i]区间和p的[0,j]区间,我们分情况讨论:
 (1)s[i] == p[j]或者p[j] == '?'时,dp[i] [j] = dp[i - 1] [j - 1],即只要p的[j - 1]区域能和s的[i - 1]区域匹配,p的[0, j]就可以和s的[0, i]匹配。(比如s = “abc”,p = “ab?”)
 (2)p[j] == ’ * ’ 的情况,这个时候有三种可能使得p[0, j]和s[0, i]匹配:
 ①p的[0, j]可以和s的[0, i - 1]匹配,p[j] == ’ * ’ 在表示原来的字符串基础上加上s[i]即可,即dp[i - 1] [j]为真dp[i] [j]为真。(比如s = “abc”,p = “a*”,"ab"和"a*"是匹配的)
 ②p的[0, j - 1]可以和s的[0, i]匹配, ’ * ’ 这个时候匹配空串即可,即dp[i] [j - 1]为真dp[i] [j]为真。(比如s = “ab”,p = “ab*”)
 ③p[0, j - 1]匹配和s的[0, i - 1],p[j] == ’ * ’ 去替换s[i],但这种情况实际是可以被归于第一种情况的,如果s[0, i - 1]和p[0, j - 1]匹配,那么s[0, i - 1]和p[0 , j]也一定会匹配,这个时候 ’ * ’ 做空字符串,即dp[i - 1] [j - 1]为真 == dp[i - 1] [j]为真。
 以上情况只要一个为真dp[i] [j]就为真。
-  初始化 
 和前面一样,为了避免越界以及方便初始化,我们引入空串的概念,多开一行和一列。
 ①其中两者都为空串可匹配,即dp[0] [0] = true。
 ②s为空串,p不为空串(第一行除去[0, 0])的时候如果p的[0, j]区间为连续的 ’ * ’ 也是可以匹配空串的,dp[0] [0……j] = true。([0, j]区间表示连续的 ’ * ’ )
 ③p为空串,s不为空串(第一列除去[0, 0]),这个时候不可能匹配,第一列除开[0][0]其它都初始化为false。
-  填表顺序 
 填表不明白参考第一题,填表顺序为行从上到下,每一行从左到右。
-  返回值 
 依据状态表示,返回值为dp[m] [n](m,n分别为s、p长度)。
- 代码实现
class Solution {
public:bool isMatch(string s, string p) {int m = s.size(), n = p.size();s = " " + s, p = " " + p;   //处理下标映射//dp[i][j]:p的[0, j]区间能否匹配s的[0, i]区间vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));dp[0][0] = true;  for(int j = 1; j <=n; j++)  //初始化s为空串,p有连续'*'可匹配的情况{if(p[j] == '*')dp[0][j] = true;elsebreak;  //出现非'*'直接结束循环,后面不可能匹配了}for(int i = 1; i <= m; i++)       for(int j = 1; j <= n; j++){if(p[j] == '*')dp[i][j] = dp[i - 1][j] || dp[i][j - 1];else if(s[i] == p[j] || p[j] == '?')dp[i][j] = dp[i - 1][j - 1];}return dp[m][n];}
};
4.正则表达式(困难)
链接:正则表达式
-  题目描述 
  
-  做题步骤 
-  状态表示 
 有前面的做题经验,我们定义一个二维表,定义状态表示为dp[i] [j]:p的[0, j]区域能否匹配s的[0, i]区域。
-  状态转移方程 
 这个题目的重点:"a*"说明这个部分可以出现多次,也可以出现0次,即a表示空串,所以分析的时候应该把"字符 + "当作一个整体来考虑。
 对s的[0,i]区间和p的[0,j]区间,我们分情况讨论:
 (1)s[i] == p[j]或p[j] == ’ . ’ ,只需要p的[0, j - 1]和s的[0, i - 1]匹配即可,即dp[i - 1] [j - 1]为真dp[i] [j]就为真。(比如s = "abc"和p = “ab.”)
 (2)p[j] == ’ * ’ 的情况,这个时候有三种可能使得p[0, j]和s[0, i]匹配:
 ①p[0, j - 2]和s[0, i]匹配,后面的"字符+"表示空串。即dp[i] [j - 2]为真dp[i] [j]就为真。(比如s = “abc”,p = “abcg*”,p后面的"g*"可以直接作空串)
 ②p[0, j]和s[0, i - 1]匹配,原本的"字符+"需要多表示一个字符。
 但这里多表示的字符是固定的,也就是说必须满足p[j - 1] == s[i] 或 p[j - 1] == ’ . ’ ,这个多表示的字符才能符合要求。即满足前面条件dp[i - 1] [j]为真dp[i] [j]就为真。
 (比如s = “abbb”,p = “ab*”,其中"ab*"是可以匹配"abb"的,刚好"b*"多表示一个’ b ’ 符合匹配要求。如果s = "abbc"就p就无法匹配s了)
 以上情况只要一个为真dp[i] [j]就为真。
-  初始化 
 为了避免越界已经方便初始化,我们引入空串的概念,多开一行一列。
 ①其中两者都为空串可匹配,即dp[0] [0] = true。
 ②当s为空串,p不为空串(第一行除去[0, 0])的时候如果p为连续的"字符 + * + 字符 + * ……",让这些"字符+ *"全都作空串,是可以匹配s的。即dp[0] [j] = true(j = 2; j <= n; j += 2)。
 ③p为空串,s不为空串(第一列除去[0, 0]),这个时候不可能匹配,第一列除开[0] [0]其它都初始化为false。
-  填表顺序 
 填表不明白参考第一题,填表顺序为行从上到下,每一行从左到右。
-  返回值 
 依据状态表示,返回值为dp[m] [n](m,n分别为s、p长度)。
- 代码实现
class Solution {
public:bool isMatch(string s, string p) {int m = s.size(), n = p.size();//处理下标映射s = " " + s,  p = " " + p;//dp[i][j]:p的[0,j]区域能否和s的[0,i]区域匹配vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));dp[0][0] = 1;  //空串可以匹配空串for(int j = 2; j <= n; j += 2)  //s为空串时p为连续的"字符 + *"是可以匹配的{if(p[j] == '*') dp[0][j] = true;elsebreak;}for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){if(p[j] == '*'){dp[i][j] = dp[i][j-2] || (p[j-1] == '.' || p[j-1] == s[i]) && dp[i-1][j];}else if(s[i] == p[j] || p[j] == '.'){dp[i][j] = dp[i - 1][j - 1];}}return dp[m][n];}
};
5.交错字符串(中等)
链接:交错字符串
-  题目描述 
  
-  做题步骤 
-  状态表示 
 有前面的做题经验,我们定义一个二维表,定义状态表示为dp[i] [j]:s1的[0, i]区间和s2的[0, j]区间能否交错组成s3的[0, i + j]区间。
-  状态转移方程 
 对s1的[0,i]区间和s2的[0,j]区间能否交错组成s3的[0, i + j]区间,我们分情况讨论:
 (1)s1[i] == s3[i + j]。这个时候只要s1的[0, i - 1]区间和s2的[0, j]区间可以组成s3的[0,i + j - 1]区间即真,即dp[i] [j] = (s1[i] == s3[i + j] && dp[i - 1] [j])
 (2)s2[j] == s3[i + j]。这个时候只要s1的[0, i]区间和s2的[0, j - 1]区间可以组成s3的[0,i + j - 1]区间即真,即dp[i] [j] = (s2[j] == s3[i + j] && dp[i] [j - 1])
 以上情况只要一个为真dp[i] [j]就为真。
-  初始化 
 为了避免越界以及方便初始化,我们引入空串的概念,多开一行一列。
 ①其中s1和s2都为空串可以组成空串s3,即dp[0][0] = true。
 ②当s1为空串,s2不为空串(第一列除去[0, 0])的时候可以由s2单独组成s3,前提是相等。即dp[0] [j] = true([1, j]区间s2与s3相等)。
 ③当s2为空串,s1不为空串(第一行除去[0, 0])的时候可以由s1单独组成s3,前提是相等。即dp[i] [0] = true([1, i]区间s1与s3相等)。
-  填表顺序 
 填表不明白参考第一题,填表顺序为行从上到下,每一行从左到右。
-  返回值 
 依据状态表示,返回值为dp[m] [n](m,n分别为s1、s2长度)。
- 代码实现
class Solution
{
public:bool isInterleave(string s1, string s2, string s3) {int m = s1.size(), n = s2.size();if(m + n != s3.size()) return false;  //两者相加比s3长度小,一定没办法组成的s1 = " " + s1, s2 = " " + s2, s3 = " " + s3;  //处理下标映射//dp[i][j]:s1的[1,i]区间和s2的[1,j]区间能否交错组成s3的[1,i+j]区间vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));dp[0][0] = true;for(int j = 1; j <= n; j++) // 初始化第⼀⾏,即s1为空,s2单独组成s3{if(s2[j] == s3[j]) dp[0][j] = true;else break;}for(int i = 1; i <= m; i++) // 初始化第⼀列,即s2为空,s1单独组成s3{if(s1[i] == s3[i]) dp[i][0] = true;else break;}for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++)dp[i][j] = (s1[i] == s3[i + j] && dp[i - 1][j])|| (s2[j] == s3[i + j] && dp[i][j - 1]);        return dp[m][n];}
};
6.两个字符串的最小ASCII删除和(中等)
链接:两个字符串的最小ASCII删除和
-  题目描述 
  
-  做题步骤 
-  状态表示 
 有前面的做题经验,我们定义一个二维表,定义状态表示为dp[i] [j]:s1的[0, i]区间和s2的[0, j]区间要达到相同的最小删除消耗。
-  状态转移方程 
 对s1的[0,i]区间和s2的[0,j]区间如何相同,我们分情况讨论:
 (1)s1[i] == s2[j]时,只需要让s1的[1, i - 1]和s2[1, j - 1]相同,即dp[i] [j] = dp[i - 1] [j - 1]。
 (2)s1[i] != s2[j]时,有两种选择:
 ①让s1的[1, i - 1]和s2的[1, j]相同,把多余的s1[i]删除,即dp[i] [j] = dp[i - 1] [j] + s1[i]。
 ②s1的[1, i]和s2的[1, j -1]相同,把多余的s2[j]删除,即dp[i] [j] = dp[i] [j - 1] + s2[j]。
 取①②情况的最小值即可,即(2)情况dp[i][j] = min(dp[i] [j - 1] + s2[j], dp[i - 1] [j] + s1[i])。
 这里提一下(1)情况的消耗是一定小于等于(2)的消耗,比如我一个短串和一个长串达到相等的消耗了x。现在我在短串后面加一些字符,想达到相等的话消耗一定会大于等于x。
-  初始化 
 为了避免越界以及方便初始化,我们引入空串的概念,多开一行一列。
 ①当s1和s2都为空串,消耗为0,即dp[0] [0] = 0。
 ②当s1为空串,s2不为空串(第一列除去[0, 0])的时候s2必须全部删除一直到为空串。即dp[0] [j] = dp[0] [j - 1] + s2[j] (j = 1; j <= n; j++)。
 ③当s2为空串,s1不为空串(第一行除去[0, 0])的时候s1必须全部删除一直到为空串。即dp[i] [0] = dp[i - 1] [0] + s1[i] (i = 1; i <= m; i++)。
-  填表顺序 
 填表不明白参考第一题,填表顺序为行从上到下,每一行从左到右。
-  返回值 
 依据状态表示,返回值为dp[m] [n](m,n分别为s1、s2长度)。
- 代码实现
class Solution {
public:int minimumDeleteSum(string s1, string s2) {int m = s1.size(), n = s2.size();s1 = " " + s1, s2 = " " + s2;   //处理下标映射//dp[i][j]:s1的[1,i]区间和s2的[1,j]区间要达到相同的最小删除消耗vector<vector<int>> dp(m + 1, vector<int>(n + 1));//s1为空串,s2要删除为空串的最小消耗for(int j = 1; j <= n; j++)dp[0][j] = dp[0][j - 1] + s2[j];//s2为空串,s1要删除到空串的最小消耗for(int i = 1; i <= m; i++)dp[i][0] = dp[i - 1][0] + s1[i];for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){if(s1[i] == s2[j])dp[i][j] = dp[i - 1][j - 1];elsedp[i][j] = min(dp[i][j - 1] + s2[j], dp[i - 1][j] + s1[i]);}return dp[m][n];}
};
7.最长重复子数组(中等)
链接:最长重复子数组
-  题目描述 
  
-  做题步骤 
-  状态表示 
 这个题不难,但是注意它是子数组而不是子序列,我们用前面的方式定义状态表示是会出错的,比如我定义状态表示为dp[i] [j]:n1的[0, i]区间与n2的[0, j]区间中的公共最长子数组长度。
 拿n1 = [3, 1, 1]和n2 = [1, 0, 1]举例,n1的[3, 1]区间和n2的[1, 0]区间公共最长子数组长度为1,当n1[2] == n2[2]的时候,公共最长子数组是没办法算的,你想dp[i - 1][j - 1] + 1是绝对不行的,因为n1[2]和n2[2]不一定能接在这个最长子数组后面,子数组必须是连续的!!!
 前面以区间为关注对象,没办法推导状态转移方程,那我们就以n1[i]和n2[j]为子数组结尾进行分析。
 我们定义一个二维表,定义状态表示为dp[i] [j]:同时以n1的i位置和n2的j位置结尾的公共最长子数组长度。
-  状态转移方程 
 对n1[i]和n2[j],我们分情况讨论:
 (1)n1[i] == n2[j]时,可以同时接在以n1[i - 1]和n2[j - 1]为结尾的公共最长子数组后面,长度加1,即dp[i] [j] = dp[i - 1] [j - 1] + 1。
 (2)n1[i] != n2[j]时,同时以n1[i]和n2[j]为结尾的公共最长子数组不存在,即dp[i] [j] = 0。
-  初始化 
 为了避免越界,我们多开一行一列,dp数组下标从1开始,多出来的一行一列初始化为0即可。(注意处理与n1和n2数组的下标映射,因为n1和n2数组是从下标0开始的)
-  填表顺序 
 填表顺序为行从上到下,每一行从左到右。
-  返回值 
 没法直接确定最长子数组的结尾,所以一边dp一边更新最大值。
- 代码实现
class Solution {
public:int findLength(vector<int>& n1, vector<int>& n2) {int m = n1.size(), n = n2.size();//dp[i][j]表示以nums1的i位置和nums2的j位置结尾的公共最长子数组长度vector<vector<int>> dp(m + 1, vector<int>(n + 1));int ret = 0;for(int i = 1; i <= m; i++)for(int j = 1; j <= n; j++){if(n1[i - 1] == n2[j - 1])  //注意下标映射dp[i][j] = dp[i - 1][j - 1] + 1;ret = max(ret, dp[i][j]);}return ret;}
};
相关文章:
 
动态规划:两个数组的dp问题(C++)
动态规划:两个数组的dp问题 前言两个数组的dp问题1.最长公共子序列(中等)2.不同的子序列(困难)3.通配符匹配(困难)4.正则表达式(困难)5.交错字符串(中等&…...
 
BASH shell脚本篇2——条件命令
这篇文章介绍下BASH shell中的条件相关的命令,包括:if, case, while, until, for, break, continue。之前有介绍过shell的其它基本命令,请参考:BASH shell脚本篇1——基本命令 1. If语句 if语句用于在顺序执行语句的流程中执行条…...
 
【图论C++】Floyd算法(多源最短路径长 及 完整路径)
>>>竞赛算法 /*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在算法竞赛学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记ÿ…...
 
小谈设计模式(11)—模板方法模式
小谈设计模式(11)—模板方法模式 专栏介绍专栏地址专栏介绍 模板方法模式角色分类抽象类(Abstract Class)具体子类(Concrete Class)抽象方法(Abstract Method)具体方法(C…...
 
C#程序中很多ntdll.dll、clr.dll的线程
如下图 需要“右键工程——调试——取消勾选‘启用本地代码调试’”即可。...
 
低代码工作流程管理系统:提升企业运营效率的利器
业务运营状况是否良好,除了人员需要配合以外,真正发挥作用的是背后的工作流程。将重复的工作进行自动化处理,确保这些流程最终指向同一个目标、实现一致的运营结果。而设计和实施不佳的工作流程则产生相反的效果——导致处理时间延长、运营成…...
HIVE SQL regexp_extract和regexp_replace配合使用正则提取多个符合条件的值
《平凡的世界》评分不错,《巴黎圣母院》改变成的电影不错,还有<<1984>>也蛮好看。 如何使用regexp_extract®exp_replace函数将以上文本中所有书籍名称都提取出来? select substr(regexp_replace(regexp_extract(regexp_…...
debian 安装matlab2022b报错解决方法与问题解决思路
报错 terminate called after throwing an instance of ‘std::runtime_error’ 在安装目录执行 ./bin/glnxa64/MATLABWindow通过执行以上命令发现是和libharfbuzz库有关。 该库在调用freetype库时,有方法找不到。 偿试remove freetype库,发现该库有大…...
 
Jenkins集成AppScan实现
一、Jenkins上安装插件 在Jenkins里安装以下插件 ibm-security-appscanstandard-scanner 二、打开AppScan 1、配置需要扫描的地址 配置需要扫描的地址 2、记录好要扫描的URL登录序列 记录好要扫描的URL登录序列 3、导出要扫描的URL登录序列设置 导出要扫描的URL登录序列设置 三…...
 
10.1 File类
前言: java.io包中的File类是唯一一个可以代表磁盘文件的对象,它定义了一些用于操作文件的方法。通过调用File类提供的各种方法,可以创建、删除或者重命名文件,判断硬盘上某个文件是否存在,查询文件最后修改时间&…...
 
[论文笔记]UNILM
引言 今天带来论文Unified Language Model Pre-training for Natural Language Understanding and Generation的笔记,论文标题是 统一预训练语言模型用于自然语言理解和生成。 本篇工作提出了一个新的统一预训练语言模型(Unifield pre-trained Language Model,UniLM),可以同…...
 
LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略
LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略 导读:2023年9月25日,Colossal-AI团队推出了开源模型Colossal-LLaMA-2-7B-base。Colossal-LLaMA-2项目的技术细节,主要核心要点总结如下: >> 数据处…...
 
国庆作业2
select实现服务器并发 代码: #include <myhead.h>#define ERR_MSG(msg) do{\printf("%d\n",__LINE__);\perror(msg);\ }while(0)#define PORT 8888#define IP "192.168.1.5"int main(int argc, const char *argv[]) {//创建流式套接字…...
fork仓库的代码如何同步主仓库代码
1.背景 我fork了一份 jekyll-theme-chirpy 仓库的代码(基于 jekyll 的自建博客仓库,可以免服务器),我需要在上面更新我的博客文章,但是我又想一直同步 jekyll-theme-chirpy 仓库的新功能,这样我可以更新自己的博客功能。所以我就…...
 
【Axure】元件库和母版、常见的原型规范、静态原型页面制作
添加现有元件库 点击元件库——载入 当然也可以创建元件库,自己画自己保存 建立京东秒杀母版 静态原型页面的制作 框架 选择以iphone8的界面大小为例,顶部状态栏高度为20 左侧类似于标尺,因为图标、文字离最左侧的间距是不一样的 信…...
在设备树中描述中断
参考文档: 内核 Documentation\devicetree\bindings\interrupt-controller\interrupts.txt 在设备树中,中断控制器节点中必须有一个属性: interrupt-controller,表明它是“中断控制器”。 还必须有一个属性: #interru…...
 
ccf_csp第一题汇总
ccf_csp第一题汇总 printf()输出格式大全(附 - 示例代码)现值计算AcWing 4699. 如此编码AcWing 4509. 归一化处理(小数位数根号函数)AcWing 4454. 未初始化警告AcWing 4280. 序列查询AcWing 4006. 数组推导(小陷阱)AcWing 3292. 称检测点查询AcWing 3287…...
 
uniapp 实现下拉筛选框 二次开发定制
前言 最近又收到了一个需求,需要在uniapp 小程序上做一个下拉筛选框,然后找了一下插件市场,确实有找到,但不过他不支持搜索,于是乎,我就自动动手,进行了二开定制,站在巨人的肩膀上&…...
 
实现单行/多行文本溢出
在日常开发展示页面,如果一段文本的数量过长,受制于元素宽度的因素,有可能不能完全显示,为了提高用户的使用体验,这个时候就需要我们把溢出的文本显示成省略号。 一. 单行文本溢出 即文本在一行内显示,超出…...
Spring Boot中的Binder类
介绍 Spring Boot中的Binder类是一个用于绑定属性的工具类。它可以将配置文件中的属性值绑定到Java对象中,从而方便地进行配置管理。 简单示例 import org.springframework.boot.context.properties.bind.Binder; import org.springframework.core.env.Environmen…...
 
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
 
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
 
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
 
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
