【算法深度探索】动态规划之旅(1):挑战OJ题海,解锁15道经典难题,让你成为DP大师!

在这里插入图片描述

📃博客主页: 小镇敲码人
🚀 欢迎关注:👍点赞 👂🏽留言 😍收藏
🌏 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧月,独傲天下百坚强。 男儿应有龙腾志,盖世一意转洪荒。 莫使此生无痕度,终归人间一捧黄。🍎🍎🍎
❤️ 什么?你问我答案,少年你看,下一个十年又来了 💞 💞 💞

【算法深度探索】动态规划之旅(1):挑战OJ题海,解锁15道经典难题,让你成为DP大师!

  • OJ题1:石子游戏,难度分:1590
    • 题目解析
    • 算法原理
    • 代码实现
    • 使用滚动数组优化
  • OJ题2:下降路径最小和 难度分:1573
    • 题目解析
    • 算法原理
    • 代码实现
  • OJ题3:最长字符串链 难度分:1599
    • 题目解析
    • 算法原理
    • 代码实现
  • OJ题4:最长定差子序列 难度分:1597
    • 题目解析
    • 算法原理
    • 代码实现
  • OJ题5:将整数按权重排序 难度分:1507
    • 题目解析
    • 算法原理
    • 代码实现
  • OJ题6:使绳子变成彩色的最短时间 难度分:1574
    • 题目解析
    • 算法原理
    • 代码实现
  • OJ题7:统计字典序元音字符串的数目 难度分:1519
    • 题目解析
    • 算法原理
    • 代码实现
    • 滚动数组优化
  • OJ题8:子数组和的绝对值的最大值 难度分:1542
    • 题目解析
    • 算法原理
    • 代码实现
    • 滚动数组优化
  • OJ题9: 个位数字为 K 的整数之和 难度分:1559
    • 题目解析
    • 算法原理
    • 代码实现
  • OJ题10:达到末尾下标所需的最大跳跃次数 难度分:1533
    • 题目解析
    • 算法原理
    • 代码实现
  • OJ题11:判断是否能拆分数组 难度分:1543 ---区间dp
    • 题目解析
    • 算法原理
    • 代码实现
  • OJ题12:推多米诺 难度分:1638
    • 题目解析
    • 算法原理
    • 代码实现
  • OJ题13:将字符串翻转到单调递增 难度分:1602
    • 题目解析
    • 算法原理
    • 代码实现
    • 滚动数组优化
  • OJ题14:骑士拨号器 难度分:1690
    • 题目解析
    • 算法原理
    • 代码实现
    • 滚动数组优化
  • OJ题15:掷骰子等于目标和的方法数 难度分:1654---分组背包
    • 题目解析
    • 算法原理
    • 代码实现
    • 滚动数组优化

前言:本篇博客旨在帮助大家学习和了解DP算法,并熟练的掌握DP算法的原理和一些套路,以题解的形式给出,题目出自力扣平台,后面的数字代表难度分。

OJ题1:石子游戏,难度分:1590

这里是题目链接

题目解析

在这里插入图片描述

算法原理

下面我们来尝试使用动态规划来解决这道题。

在这里插入图片描述

代码实现

class Solution {
public:bool stoneGame(vector<int>& piles) {//创建dp表//初始化//填表//返回值int n = piles.size();vector<vector<int>> dp(n,vector<int>(n));dp[0][0] = piles[0];dp[n-1][n-1] = piles[n-1];for(int i = n-2;i >= 0;i--)for(int j = i;j < n;j++)if(j > 0)dp[i][j] = max(piles[i]-dp[i+1][j],piles[j]-dp[i][j-1]);return dp[0][n-1] > 0;}
};

ak截图:

在这里插入图片描述

使用滚动数组优化

在这里插入图片描述

代码实现:

class Solution {
public:bool stoneGame(vector<int>& piles) {//创建dp表//初始化//填表//返回值int n = piles.size();vector<int> dp(n);dp[0] = piles[0];dp[n-1] = piles[n-1];for(int i = n-2;i >= 0;i--)for(int j = i;j < n;j++)if(j > 0)dp[j] = max(piles[i]-dp[j],piles[j]-dp[j-1]);return dp[n-1] > 0;}
};

ak截图:

在这里插入图片描述

OJ题2:下降路径最小和 难度分:1573

这里是题目链接

题目解析

在这里插入图片描述

算法原理

我们尝试使用动态规划来解决一下这道题

在这里插入图片描述

代码实现

class Solution {
public:int minFallingPathSum(vector<vector<int>>& matrix) {//创建dp表//初始化//填表//返回值int INF = 0x3f3f3f3f;int n = matrix.size();int m = matrix[0].size();vector<vector<int>> dp(n+1,vector<int>(m+2,INF));for(int j = 0;j <= m;++j)dp[0][j] = 0;for(int i = 1;i <= n;++i)for(int j = 1;j <= m;++j)dp[i][j] = min(dp[i-1][j-1],min(dp[i-1][j],dp[i-1][j+1]))+matrix[i-1][j-1];int ret = INF;for(int j = 1;j <= m;++j)ret = min(ret,dp[n][j]);return ret;}
};

ak截图:

在这里插入图片描述

OJ题3:最长字符串链 难度分:1599

这里是题目链接

题目解析

在这里插入图片描述

算法原理

下面我们使用动态规划来解决一下这道题。

在这里插入图片描述

代码实现

int compare(string& a,string& b)
{return a.size() < b.size();
}
class Solution {
public:int longestStrChain(vector<string>& words) {sort(words.begin(),words.end(),compare);//排序unordered_map<string,int> hash;int n = words.size();for(int i = 0;i < n;++i)hash[words[i]] = i;vector<int> dp(n,1);int ret = 1;for(int i = 1;i < n;++i){for(int j = 0;j < words[i].size();++j){string wordprev = words[i].substr(0,j)+words[i].substr(j+1);if(hash.count(wordprev))dp[i] = max(dp[hash[wordprev]]+1,dp[i]);}ret = max(ret,dp[i]);}return ret;}
};

ak截图:

在这里插入图片描述

OJ题4:最长定差子序列 难度分:1597

这里是题目链接

题目解析

在这里插入图片描述

算法原理

在这里插入图片描述

代码实现

class Solution {
public:int longestSubsequence(vector<int>& arr, int difference) {int n = arr.size();unordered_map<int,int> hash;//值-下标//创建dp表//初始化//填表//返回值vector<int> dp(n,1);int ret = 0;for(int i = 0;i < n;++i){int a = arr[i];if(hash.count(a-difference))dp[i] = dp[hash[a-difference]]+1;hash[arr[i]] = i;ret = max(ret,dp[i]);}return ret;}
};

ak截图:

在这里插入图片描述

OJ题5:将整数按权重排序 难度分:1507

这里是题目

题目解析

在这里插入图片描述

算法原理

在这里插入图片描述

代码实现

int compare(vector<int>& a,vector<int>& b)
{return a[1] < b[1] || (a[1] == b[1] && a[0] < b[0]);
}
class Solution {
private:unordered_map<int,int> dp;
public:int getF(int i){if(dp.count(i))return dp[i];if(i == 1)return 0;else if(i & 1)return dp[i] = 1+getF(3*i+1);elsereturn dp[i] = 1+getF(i/2);}int getKth(int lo, int hi, int k) {//创建dp表//初始化//填表vector<vector<int>> x;for(int i = lo;i <= hi;++i)x.push_back({i,getF(i)});sort(x.begin(),x.end(),compare);return x[k-1][0];}
};

ak截图:

在这里插入图片描述

OJ题6:使绳子变成彩色的最短时间 难度分:1574

使绳子变成彩色的最短时间

题目解析

在这里插入图片描述

算法原理

在这里插入图片描述

代码实现

class Solution {
public:int minCost(string colors, vector<int>& neededTime) {//创建dp表//初始化//填表//返回值int n = neededTime.size();vector<int> dp(n);int sum = 0;for(auto& i:neededTime)sum += i;dp[0] = neededTime[0];int ret = dp[0];int prev = 0;for(int i = 1;i < n;++i){if(colors[i] != colors[i-1]){dp[i] = dp[i-1]+neededTime[i];prev = i;}else {if(neededTime[i] > neededTime[prev]){dp[i] = dp[i-1]-neededTime[prev]+neededTime[i];prev = i;}elsedp[i] = dp[i-1];}ret = max(ret,dp[i]);}return sum-ret;}
};

ak截图:

在这里插入图片描述

OJ题7:统计字典序元音字符串的数目 难度分:1519

这里是题目

题目解析

在这里插入图片描述

算法原理

下面我们使用动态规划来解决一下这道题。

在这里插入图片描述

代码实现

class Solution {
public:int countVowelStrings(int n) {//创建dp表//初始化//填表//返回值vector<vector<int>> dp(n+1,vector<int>(6));dp[0][5] = 1;for(int i = 1;i <= n;++i)for(int j = 1;j <= 5;++j){for(int k = j;k <= 5;++k)dp[i][j] += dp[i-1][k];}int ret = 0;for(int i = 1;i <= 5;++i)ret += dp[n][i];return ret;}
};

ak截图:

在这里插入图片描述

滚动数组优化

很明显,每一个状态只依赖于它自己和它上一行后面列的数,只用一维数组实现滚动就可以了,注意要从左向右滚动,否则我们要的数就会被覆盖。

代码实现:

class Solution {
public:int countVowelStrings(int n) {//创建dp表//初始化//填表//返回值vector<int> dp(6);dp[5] = 1;for(int i = 1;i <= n;++i)for(int j = 1;j <= 5;++j){for(int k = j+1;k <= 5;++k)dp[j] += dp[k];}int ret = 0;for(int i = 1;i <= 5;++i)ret += dp[i];return ret;}
};

ak截图:

在这里插入图片描述

OJ题8:子数组和的绝对值的最大值 难度分:1542

这里是题目

题目解析

在这里插入图片描述

算法原理

下面我们使用动态规划来解决一下这道题。

在这里插入图片描述

代码实现

class Solution {
public:int maxAbsoluteSum(vector<int>& nums) {//创建dp表//初始化//填表//返回值int n = nums.size();vector<int> f(n),g(n);g[0] = f[0] = nums[0];int ret = abs(nums[0]);for(int i = 1;i < n;++i){f[i] = max(f[i-1]+nums[i],nums[i]);g[i] = min(g[i-1]+nums[i],nums[i]);ret = max(ret,max(f[i],abs(g[i])));}return ret;}
};

ak截图:

在这里插入图片描述

滚动数组优化

我们可以发现不管是g数组、还是f数组它每一次推导之前那个状态都只依赖于前一个状态,我们可以使用两个变量来取代那一个数组,不断让新的值覆盖这个变量即可,保证要用到上一个状态的时候它还没有被覆盖,所以要从左往右填表。

代码实现:

class Solution {
public:int maxAbsoluteSum(vector<int>& nums) {//创建dp表//初始化//填表//返回值int n = nums.size();int g = nums[0],f = nums[0];int ret = abs(nums[0]);for(int i = 1;i < n;++i){f = max(f+nums[i],nums[i]);g = min(g+nums[i],nums[i]);ret = max(ret,max(f,abs(g)));}return ret;}
};

ak截图:

在这里插入图片描述

OJ题9: 个位数字为 K 的整数之和 难度分:1559

这里是题目

题目解析

在这里插入图片描述

算法原理

在这里插入图片描述

代码实现

class Solution {
public:int minimumNumbers(int num, int k) {//创建dp表//初始化//返回值vector<int> dp(num+1,INT_MAX);vector<int> ans;//保存个位为k的数dp[0] = 0;for(int i = 1;i <= num;++i){if(i % 10 == k)dp[i] = 1;else{for(int j = 0;j < ans.size();++j){if(dp[i-ans[j]] != INT_MAX)dp[i] = min(dp[i],dp[i-ans[j]]+1);}}if(i % 10 == k)ans.push_back(i);}return dp[num] == INT_MAX ? -1:dp[num];}
};

ak截图:

在这里插入图片描述

OJ题10:达到末尾下标所需的最大跳跃次数 难度分:1533

这里是题目

题目解析

在这里插入图片描述

算法原理

我们来尝试使用动态规划来解决这个题目。

在这里插入图片描述

代码实现

class Solution {
public:int maximumJumps(vector<int>& nums, int target) {//创建dp表//初始化//返回值int n = nums.size();vector<int> dp(n,INT_MIN);dp[0] = 0;for(int i = 1;i < n;++i){for(int j = i-1;j >= 0;--j){int gap = abs(nums[j]-nums[i]);if(gap <= target && dp[j] != INT_MIN){dp[i] = max(dp[j]+1,dp[i]);}}}return dp[n-1] == INT_MIN ? -1 : dp[n-1];}
};

ak截图:

在这里插入图片描述

OJ题11:判断是否能拆分数组 难度分:1543 —区间dp

这里是题目

题目解析

在这里插入图片描述

算法原理

下面我们尝试使用动态规划来解决一下这道题。

在这里插入图片描述

代码实现

class Solution {
public:bool canSplitArray(vector<int>& nums, int m) {//创建dp表//初始化//返回值int n = nums.size();vector<vector<bool>> dp(n,vector<bool>(n,true));for(int i = 0;i+3 <= n;++i){if(nums[i]+nums[i+1] >= m || nums[i+1]+nums[i+2] >= m)dp[i][i+2] = true;elsedp[i][i+2] = false; }for(int i = n-2;i >= 0;--i){for(int j = i+3;j < n;++j)dp[i][j] = dp[i+1][j] || dp[i][j-1];}return dp[0][n-1];}
};

ak截图:

在这里插入图片描述

OJ题12:推多米诺 难度分:1638

这里是题目

题目解析

在这里插入图片描述

算法原理

下面我们使用动态规划来解决一下这道题。

在这里插入图片描述

代码实现

class Solution {
public:string pushDominoes(string& dominoes) {//创建dp表//初始化int n = dominoes.size();vector<int> dp(n,0);if(dominoes[0] == 'L')dp[0] = -1;if(dominoes[0] == 'R')dp[0] = 1;for(int i = 1;i < n;++i){if(dominoes[i] == '.'){if(dp[i-1] > 0)dp[i] = dp[i-1]+1;}else if(dominoes[i] == 'R')dp[i] = 1;elsedp[i] = -1;}for(int i = n-1;i >= 0;--i){if(dominoes[i] == '.'){if(i < n-1 && dp[i+1] < 0){if(dp[i] + dp[i+1]-1 > 0)dp[i] = dp[i+1]-1;else if(dp[i]+dp[i+1]-1 == 0)dp[i] = 0;else if(dp[i] <= 0)dp[i] = dp[i+1]-1;}if(dp[i] == 0)dominoes[i] = '.';else if(dp[i] > 0)dominoes[i] = 'R';else dominoes[i] = 'L';}}return dominoes;}
};

ak截图:

在这里插入图片描述

OJ题13:将字符串翻转到单调递增 难度分:1602

这里是题目

题目解析

在这里插入图片描述

算法原理

我们使用动态规划来解决一下这道题。

在这里插入图片描述

代码实现

class Solution {
public:int minFlipsMonoIncr(string s) {//创建dp表//初始化//填表//返回值int n = s.size();vector<vector<int>> dp(n+1,vector<int>(2));for(int i = 2;i <= n;++i){if(s[i-1] == '0'){dp[i][0] = dp[i-1][0];if(s[i-2] != '0')dp[i][0]++;dp[i][1] = min(dp[i-1][0],dp[i-1][1])+1;}else//s[i-1] == '1'{dp[i][0] = dp[i-1][0];if(s[i-2] != '0')dp[i][0]++;dp[i][1] = min(dp[i-1][0],dp[i-1][1]);} }return min(dp[n][1],dp[n][0]);}
};

ak截图:

在这里插入图片描述

滚动数组优化

0和1状态只依赖之前的一个状态,我们可以使用滚动数组优化。

代码实现:

class Solution {
public:int minFlipsMonoIncr(string s) {//创建dp表//初始化//填表//返回值int n = s.size();vector<int> dp(2);for(int i = 2;i <= n;++i){if(s[i-1] == '0'){dp[1] = min(dp[0],dp[1])+1;if(s[i-2] != '0')dp[0]++;}else//s[i-1] == '1'{dp[1] = min(dp[0],dp[1]);if(s[i-2] != '0')dp[0]++; 
}}return min(dp[1],dp[0]);}
};

这里注意初始化顺序,保证我们用到之前那个状态时它还没被覆盖即可。

ak截图:

在这里插入图片描述

OJ题14:骑士拨号器 难度分:1690

这里是题目

题目解析

算法原理

下面我们使用动态规划来解决一下这道题。

在这里插入图片描述

代码实现

class Solution {
public:int knightDialer(int n) {//创建dp表//初始化//填表//返回值const int MOD = 1e9+7;vector<vector<long long>> dp(n+1,vector<long long>(12,0));for(int j = 0;j < 12;++j)dp[1][j] = 1;for(int i = 2;i <= n;++i)for(int j = 1;j < 12;++j){switch(j){case 1:dp[i][j] = (dp[i-1][6]+dp[i-1][8])%MOD;break;case 2:dp[i][j] =  (dp[i-1][9]+dp[i-1][7])%MOD;break;case 3:dp[i][j] =  (dp[i-1][4]+dp[i-1][8])%MOD;break;case 4:dp[i][j] =  (dp[i-1][11]+dp[i-1][3]+dp[i-1][9])%MOD;break;case 6:dp[i][j] =  (dp[i-1][11]+dp[i-1][1]+dp[i-1][7])%MOD;break;case 7:dp[i][j] =  (dp[i-1][2]+dp[i-1][6])%MOD;break;case 8:dp[i][j] =  (dp[i-1][1]+dp[i-1][3])%MOD;break;case 9:dp[i][j] =  (dp[i-1][2]+dp[i-1][4])%MOD;break;case 11:dp[i][j] =  (dp[i-1][6]+dp[i-1][4])%MOD;break;default:break;}}long long ret = 0;for(int j = 1;j < 12;++j){if(j != 10)ret += dp[n][j];}return ret%MOD;}
};

ak截图:

在这里插入图片描述

滚动数组优化

这里虽然我们当前行的状态可能会互相用不同列的状态,我们开一个新的数组把原来的数组的值保存一下还是可以使用达到空间优化的效果。

代码实现:

class Solution {
public:int knightDialer(int n) {//创建dp表//初始化//填表//返回值if(n == 1)return 10;const int MOD = 1e9+7;vector<int> dp(12,0);for(int j = 0;j < 12;++j)dp[j] = 1;for(int i = 2;i <= n;++i){vector<int> dp1(dp);for(int j = 1;j < 12;++j){switch(j){case 1:dp[j] = (dp1[6]+dp1[8])%MOD;break;case 2:dp[j] =  (dp1[9]+dp1[7])%MOD;break;case 3:dp[j] =  (dp1[4]+dp1[8])%MOD;break;case 4:dp[j] =  (0LL+dp1[11]+dp1[3]+dp1[9])%MOD;break;case 6:dp[j] =  (0LL+dp1[11]+dp1[1]+dp1[7])%MOD;break;case 7:dp[j] =  (dp1[2]+dp1[6])%MOD;break;case 8:dp[j] =  (dp1[1]+dp1[3])%MOD;break;case 9:dp[j] =  (dp1[2]+dp1[4])%MOD;break;case 11:dp[j] =  (dp1[6]+dp1[4])%MOD;break;default:break;}}}long long ret = 0;for(int j = 1;j < 12;++j){if(j != 10 && j != 5)ret += dp[j];}return ret%MOD;}
};
  • 注意:我们的中间结果可能溢出,我们在加法的前面加上0LL(long long类型的0),就可以把int类型加法转化为long long类型的加法,然后模上一个值,int就不会溢出了。

ak截图:

在这里插入图片描述

也可以使用状态机来求解,优化的关键是要找出数字之间的对称关系已达到状态压缩的目的,把图画好,可以参考这篇题解

OJ题15:掷骰子等于目标和的方法数 难度分:1654—分组背包

这里是题目

题目解析

在这里插入图片描述

算法原理

下面我们使用动态规划来解决一下这道题。

在这里插入图片描述

代码实现

class Solution {
public:int numRollsToTarget(int n, int k, int target) {//创建dp表//初始化//填表//返回值const int MOD = 1e9+7;vector<vector<int>> dp(n+1,vector<int>(target+1));dp[0][0] = 1;for(int i = 1;i <= n;++i)for(int j = 1;j <= target;++j)for(int x = 1;x <= k;++x){if(j-x >= 0)dp[i][j] = (0LL+dp[i][j]+dp[i-1][j-x])%MOD;}return dp[n][target];}
};

ak截图:

在这里插入图片描述

滚动数组优化

我们观察到,dp[i][j]所依赖的状态都是j比它小的值,所以我们第二维倒着遍历,保证我们用到这个状态的时候,它还没有被更新为最新一行的值,注意每一个j状态更新前都要将其赋值为0,因为上一行的值对我们这行已经不起作用了。

代码实现:

class Solution {
public:int numRollsToTarget(int n, int k, int target) {//创建dp表//初始化//填表//返回值const int MOD = 1e9+7;vector<int> dp(target+1);dp[0] = 1;for(int i = 1;i <= n;++i)for(int j = target;j >= 0;--j){dp[j] = 0;for(int x = 1;x <= k;++x){if(j-x >= 0){dp[j] = (0LL+dp[j]+dp[j-x])%MOD;}}}return dp[target];}
};

ak截图:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧公厕:提升城市管理效率,改善居民生活体验

智慧公厕作为城市基础设施的重要组成部分&#xff0c;正逐渐成为改善城市品质和提升居民生活体验的一项关键措施。通过智能化管理、数字化使用和信息化运行&#xff0c;智慧公厕不仅可以为城市居民带来更舒适便利的使用体验&#xff0c;而且对于城市的高质量发展、宜居性和包容…

自动驾驶中的多目标跟踪_第四篇

自动驾驶中的多目标跟踪:第四篇 附赠自动驾驶学习资料和量产经验&#xff1a;链接 在上篇&#xff0c;我们得到了杂波背景下单目标状态的后验概率表达式。在不进行近似的情况下&#xff0c;是无法应用到实际场景中的。因此&#xff0c;在这一节&#xff0c;我们来讨论如何进行…

NASA数据集——北美地区土壤碳储量、自养呼吸(Ra)、异养呼吸(Rh)、净生态系统交换(NEE)、净初级生产力(NPP)和总初级生产力(GPP)数据

ABoVE: Multi-model Uncertainty of Carbon Stocks and Fluxes across ABoVE Domain, 2003 简介 文件修订日期&#xff1a;2019-04-18 数据集版本: 1 摘要 该数据集对碳循环各组成部分的不确定性进行了估算&#xff0c;包括&#xff1a;土壤碳储量、自养呼吸&#xff08;R…

Go语言中的互斥锁(Mutex)和读写锁(RWMutex)

Mutex Mutex结构体 type Mutex struct {state int32 //表示互斥锁的状态,比如是否被锁定等sema uint32 //表示信号里,协程阻塞等待的信号量,解锁的协程释放信号量从而唤醒等待信号量的协程 } Locked: 表示Mutex是否已被锁定(1表示已经被锁定)Woken: 表示是否有协程被唤醒(1已有…

Words(保留两位小数的输出方法,printf(“%.2f“,变量名))

题目&#xff1a;   每个句子有多个单词组成&#xff0c;句子中的每个单词的长度都可能不一样&#xff0c;我们假设每个单词的长度Ni为该单词的重量&#xff0c;你需要做的就是给出整个句子的平均重量。 保留两位小数的输出方法&#xff1a; System.out.printf("%.2f&…

电商网站流量特点和压力测试

一、电商网站介绍 电商网站&#xff0c;全称电子商务网站&#xff0c;是一种通过互联网进行商品和服务交易的商业活动。这些网站提供了一个平台&#xff0c;使得买卖双方可以进行远程交易&#xff0c;无需面对面。它们通常包括以下几个主要功能&#xff1a; 商品展示&#xff…

Go导入私有仓库

使用go.mod依赖第三方库时&#xff0c;有以下要求&#xff1a; 代码仓库托管于VCS(版本控制系统)&#xff1b;代码仓库是公开的&#xff1b;仓库地址使用域名访问&#xff1b;仓库域名支持HTTPS访问。 对于自己或者公司内部搭建的私有git&#xff0c;这些条件是比较难同时满足…

K8S node节点配置

1.开始操作之前要先关闭防火墙&#xff0c;SELinux&#xff0c;swap分区 关闭防火墙 sudo systemctl stop firewalld关闭SELinux sudo setenforce 0 # 临时关闭 sudo sed -i s/^SELINUXenforcing$/SELINUXper…

常用脚本01 - 生成证书

1 生成证书 第一步、准备脚本文件 [rootharbor-01 ssl]# vim gencert.sh #!/usr/bin/env bash set -eDOMAIN"$1" IP"$2" WORK_DIR"$(mktemp -d)"if [ -z "$DOMAIN" ]; thenecho "Domain name needed."exit 1 fiecho "…

UML2.0在系统设计中的实际使用情况

目前我在系统分析设计过程中主要使用UML2.0来表达&#xff0c;使用StarUML软件做实际设计&#xff0c;操作起来基本很顺手&#xff0c;下面整理一下自己的使用情况。 1. UML2.0之十三张图 UML2.0一共13张图&#xff0c;可以分为两大类&#xff1a;结构图-静态图&#xff0c;行…

Centos7.9 OpenSSH 安全漏洞(CVE-2023-38408)

因为CVE-2023-38408&#xff0c;需要升级升级OpenSSH版本&#xff1a; yum groupinstall -y "Development Tools" yum install -y zlib-devel openssl-devel wgetcp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak chmod 600 /etc/ssh/ssh_host_rsa_key chmod 600…

Vitalik Buterin香港主旨演讲:协议过去10年迅速发展,但存在效率、安全两大问题

2024 香港 Web3 嘉年华期间&#xff0c;以太坊联合创始人 Vitalik Buterin 在由DRK Lab主办的“Web3 学者峰会 2024”上发表主旨演讲《Reaching the Limits of Protocol Design》。 他介绍到&#xff0c;2010年代&#xff0c;基于基本密码学的协议是哈希、签名。随后&#xff…

【vscode】快捷键及配置

不显示横向滑轨&#xff08;一行太长直接在编辑界面换行显示&#xff0c;实际在代码文件上没有实际换行&#xff09; ALT z

Android音视频开发-AudioRecord

Android音视频开发-AudioRecord 本篇文章主要讲下AudioRecord. 1: 简介 AudioRecord是Android平台上的一个类&#xff0c;用于实时录制音频数据。它提供了一种方便的方式来捕获和处理音频流。 以下是关于AudioRecord的一些介绍&#xff1a; 音频源&#xff1a;Record可以从…

Linux虚拟内存简介

Linux&#xff0c;像多数现代内核一样&#xff0c;采用了虚拟内存管理技术。该技术利用了大多数程序的一个典型特征&#xff0c;即访问局部性&#xff08;locality of reference&#xff09;&#xff0c;以求高效使用CPU和RAM&#xff08;物理内存&#xff09;资源。大多数程序…

网络安全---非对称数据加密签名验证

一、课题描述 三位同学一组完成数据的非对称加密和数字签名验证传输。 三位同学分别扮演图中 Alice、Bob 和 CA 三个角色&#xff0c;Bob 和 Alice 从 CA 中获得数字证书、Bob 向 Alice 发送秘密发送一段加密并签名后的信息&#xff0c;Alice 获取 Bob 发送的加密信息&#x…

网络安全---Packet Tracer - 配置扩展 ACL

一、实验目的 在Windows环境下利用Cisco Packet Tracer进行 配置防火墙操作。 二、实验环境 1.Windows10、Cisco Packet Tracer 8.2 2.相关的环境设置 在最初的时候&#xff0c;我们已经得到了搭建好的拓扑模型&#xff0c;利用已经搭建好的拓扑模型&#xff0c;进行后续的…

[蓝桥杯 2019 国 B] 解谜游戏

[蓝桥杯 2019 国 B] 解谜游戏 题目背景 题目描述 小明正在玩一款解谜游戏。谜题由 24 24 24 根塑料棒组成&#xff0c;其中黄色塑料棒 4 4 4 根&#xff0c;红色 8 8 8 根&#xff0c;绿色 12 12 12 根 (后面用 Y 表示黄色、R 表示红色、G 表示绿色)。初始时这些塑料棒排…

华科大发布多模态大模型Monkey:低成本扩大输入分辨率,部分性能超越GPT-4V

前言 近年来&#xff0c;基于Transformer架构的多模态大语言模型(MLLM)在视觉理解和多模态推理任务中展现了出色的潜力。但这些模型通常需要大量的训练资源&#xff0c;限制了它们在更广泛研究和应用领域的普及。一种直接的解决方案是使用更小规模的预训练视觉和语言模型&…

Harmony鸿蒙南向驱动开发-MIPI CSI

CSI&#xff08;Camera Serial Interface&#xff09;是由MIPI联盟下Camera工作组指定的接口标准。CSI-2是MIPI CSI第二版&#xff0c;主要由应用层、协议层、物理层组成&#xff0c;最大支持4通道数据传输、单线传输速度高达1Gb/s。 物理层支持HS&#xff08;High Speed&…