力扣 C++|一题多解之动态规划专题(1)

fe34a1c92c5f489689fd991ff5e0f559.png

动态规划

Dynamic Programming

简写为 DP,是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,从而创立了动态规划。动态规划的应用极其广泛,包括工程技术、经济、工业生产、军事以及自动化控制等领域,并在背包问题、生产经营问题、资金管理问题、资源分配问题、最短路径问题和复杂系统可靠性问题等中取得了显著的效果。

动态规划算法的基本步骤包括:

  1. 确定状态:确定需要求解的状态,并将其表示为变量。
  2. 确定状态转移方程:根据问题的特定约束条件和目标函数,确定状态之间的转移关系,并将其表示为数学公式。
  3. 初始化:为初始状态赋初值,并将其表示为初始条件。
  4. 递推计算:根据状态转移方程,使用循环依次计算各个状态的解,并将其保存在数组或表中。
  5. 求解最终结果:根据问题的目标,从计算得到的解中得出最终结果。

动态规划算法可以用于解决各种问题,例如最短路径问题、背包问题、最长公共子序列问题等。在实现动态规划算法时,需要根据具体问题的特点进行设计和调整,以确保算法的正确性和效率。

适用条件

任何思想方法都有一定的局限性,超出了特定条件,它就失去了作用。同样,动态规划也并不是万能的。适用动态规划的问题必须满足最优化原理和无后效性。

最优化原理(最优子结构性质)

最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质 [8] 。

无后效性

将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性 [8] 。

子问题的重叠性

动态规划算法的关键在于解决冗余,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其他的算法。选择动态规划算法是因为动态规划算法在空间上可以承受,而搜索算法在时间上却无法承受,所以我们舍空间而取时间。

真题举例(1)

44. 通配符匹配

给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。
'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。

说明:

  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *

示例 1:

输入:s = "aa"  p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。

示例 2:

输入:s = "aa"  p = "*"
输出: true
解释: '*' 可以匹配任意字符串。

示例 3:

输入:s = "cb"  p = "?a"
输出: false
解释: '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。

示例 4:

输入:s = "adceb"  p = "*a*b"
输出: true
解释: 第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".

示例 5:

输入:s = "acdcb"  p = "a*c?b"
输出: false

代码1:

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:bool isMatch(string s, string p){vector<vector<bool>> dp(s.size() + 1, vector<bool>(p.size() + 1));dp[0][0] = 1;for (int j = 1; j <= p.size(); j++){dp[0][j] = dp[0][j - 1] && p[j - 1] == '*';}for (int i = 1; i <= s.size(); i++){for (int j = 1; j <= p.size(); j++){if (p[j - 1] == '*'){dp[i][j] = dp[i][j - 1] || dp[i - 1][j];}else{dp[i][j] = (s[i - 1] == p[j - 1] || p[j - 1] == '?') && dp[i - 1][j - 1];}}}return dp[s.size()][p.size()];}
};int main()
{Solution s;cout << s.isMatch("aa", "a") << endl;cout << s.isMatch("aa", "*") << endl;cout << s.isMatch("cb", "?a") << endl;cout << s.isMatch("adceb", "*a*b") << endl;cout << s.isMatch("acdcb", "a*c?b") << endl;return 0;
} 

代码2: 

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:bool isMatch(string s, string p){int m = s.size();int n = p.size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));dp[0][0] = true;for (int i = 1; i <= n; i++){if (p[i - 1] == '*')dp[0][i] = true;elsebreak;}for (int i = 1; i <= m; i++){for (int j = 1; j <= n; j++){if (p[j - 1] == '*'){dp[i][j] |= dp[i][j - 1];dp[i][j] |= dp[i - 1][j];}else{if (p[j - 1] == '?' || s[i - 1] == p[j - 1]){dp[i][j] |= dp[i - 1][j - 1];}}}}return dp[m][n];}
};int main()
{Solution s;cout << s.isMatch("aa", "a") << endl;cout << s.isMatch("aa", "*") << endl;cout << s.isMatch("cb", "?a") << endl;cout << s.isMatch("adceb", "*a*b") << endl;cout << s.isMatch("acdcb", "a*c?b") << endl;return 0;
} 

代码3: 

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:bool isMatch(string s, string p){if (p.empty())return s.empty();if (s.empty()){if (p[0] == '*')return isMatch(s, p.substr(1));elsereturn false;}if (p[0] == '*')return isMatch(s, p.substr(1)) || isMatch(s.substr(1), p);elsereturn (s[0] == p[0] || p[0] == '?') && isMatch(s.substr(1), p.substr(1));}
};int main()
{Solution s;cout << s.isMatch("aa", "a") << endl;cout << s.isMatch("aa", "*") << endl;cout << s.isMatch("cb", "?a") << endl;cout << s.isMatch("adceb", "*a*b") << endl;cout << s.isMatch("acdcb", "a*c?b") << endl;return 0;
} 

代码4: 

#include <bits/stdc++.h>
using namespace std;class Solution {
public:bool isMatch(string s, string p) {if (s == "" && p == "" || (s == "" && p == "*"))return true;if (s == p)return true;int lens = s.length();int lenp = p.length();bool questionm = false, starm = false;for (int k = 0; k < lenp; k++) {if (p[k] == '?')questionm = true;if (p[k] == '*')starm = true;}if (lenp != lens && questionm == false && starm == false)return false;int i = 0, j = 0;int mstar = 0, sstar = -1;while (i < lens) {if (j < lenp && p[j] == '*') {mstar = i;sstar = j;j += 1;} else if (j < lenp && (s[i] == p[j] || p[j] == '?')) {i++;j++;} else if (sstar != -1) {mstar += 1;j = sstar + 1;i = mstar;} elsereturn false;}while (j < lenp) {if (p[j] != '*')return false;j++;}return true;}
};int main()
{Solution s;cout << s.isMatch("aa", "a") << endl;cout << s.isMatch("aa", "*") << endl;cout << s.isMatch("cb", "?a") << endl;cout << s.isMatch("adceb", "*a*b") << endl;cout << s.isMatch("acdcb", "a*c?b") << endl;return 0;
} 

62. 不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?

示例 1:

输入:m = 3, n = 7
输出:28

示例 2:

输入:m = 3, n = 2
输出:3
解释:从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下

示例 3:

输入:m = 7, n = 3
输出:28

示例 4:

输入:m = 3, n = 3
输出:6

提示:

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 10^9

代码1:

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int uniquePaths(int m, int n){int N = m + n - 2;int M = m < n ? m - 1 : n - 1;long ans = 1;for (int i = 1; i <= M; i++)ans = ans * (N - i + 1) / i;return ans;}
};int main()
{Solution s;cout << s.uniquePaths(3, 7) << endl;cout << s.uniquePaths(3, 2) << endl;cout << s.uniquePaths(7, 3) << endl;cout << s.uniquePaths(3, 3) << endl;return 0;
} 

代码2: 

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int uniquePaths(int m, int n){if (m <= 0 || n <= 0){return 0;}vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));for (int i = 0; i < m; i++){dp[i][0] = 1;}for (int i = 0; i < n; i++){dp[0][i] = 1;}for (int i = 1; i < m; i++){for (int j = 1; j < n; j++){dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
};int main()
{Solution s;cout << s.uniquePaths(3, 7) << endl;cout << s.uniquePaths(3, 2) << endl;cout << s.uniquePaths(7, 3) << endl;cout << s.uniquePaths(3, 3) << endl;return 0;
} 

代码3: 

#include <bits/stdc++.h>
using namespace std;typedef vector<int> BigInt;
class Solution
{
public:int uniquePaths(int m, int n){if (m == 0 || n == 0)return 0;if (m == 1 || n == 1)return 1;int m_ = m - 1 + n - 1;int n_ = n - 1;BigInt a = fac(m_);int result = 0;for (int i = n_; i >= 1; i--)a = div(a, i);for (int i = m_ - n_; i >= 1; i--)a = div(a, i);int k = a.size() - 1;while (a[k] == 0)k--;for (int i = k; i >= 0; i--)result = result * 10 + a[i];return result;}BigInt fac(int n){BigInt result;result.push_back(1);for (int factor = 1; factor <= n; ++factor){long long carry = 0;for (auto &item : result){long long product = item * factor + carry;item = product % 10;carry = product / 10;}if (carry > 0){while (carry > 0){result.push_back(carry % 10);carry /= 10;}}}return result;}BigInt div(BigInt a, int d){int b = 0;BigInt result;int len = a.size();for (int i = len - 1; i >= 0; i--){b = b * 10 + a[i];result.insert(result.begin(), b / d);b = b % d;}return result;}
};int main()
{Solution s;cout << s.uniquePaths(3, 7) << endl;cout << s.uniquePaths(3, 2) << endl;cout << s.uniquePaths(7, 3) << endl;cout << s.uniquePaths(3, 3) << endl;return 0;
} 

代码4: 

#include <bits/stdc++.h>
using namespace std;class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> path(m, vector<int>(n, 0));for (int i = 0; i < n; i++)path[0][i] = 1;for (int i = 0; i < m; i++)path[i][0] = 1;for (int i = 1; i < m; i++)for (int j = 1; j < n; j++)path[i][j] = path[i - 1][j] + path[i][j - 1];return path[m - 1][n - 1];}
};int main()
{Solution s;cout << s.uniquePaths(3, 7) << endl;cout << s.uniquePaths(3, 2) << endl;cout << s.uniquePaths(7, 3) << endl;cout << s.uniquePaths(3, 3) << endl;return 0;
} 

63. 不同路径 II

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。

示例 1:

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

示例 2:

输入:obstacleGrid = [[0,1],[0,0]]
输出:1

提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j] 为 0 或 1

代码1: 

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int uniquePathsWithObstacles(vector<vector<int>> &obstacleGrid){int m = obstacleGrid.size();int n = obstacleGrid[0].size();int p[m][n];int k = 0;while (k < m && obstacleGrid[k][0] != 1)p[k++][0] = 1;while (k < m)p[k++][0] = 0;k = 0;while (k < n && obstacleGrid[0][k] != 1)p[0][k++] = 1;while (k < n)p[0][k++] = 0;for (int i = 1; i < m; i++)for (int j = 1; j < n; j++){if (obstacleGrid[i][j] == 1)p[i][j] = 0;elsep[i][j] = p[i - 1][j] + p[i][j - 1];}return p[m - 1][n - 1];}
};int main()
{Solution s;vector<vector<int>> obstacleGrid = {{0,0,0},{0,1,0},{0,0,0}};cout << s.uniquePathsWithObstacles(obstacleGrid) << endl;obstacleGrid = {{0,1},{0,0}};cout << s.uniquePathsWithObstacles(obstacleGrid) << endl;return 0;
} 

代码2: 

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int uniquePathsWithObstacles(vector<vector<int>> &obstacleGrid){int m = obstacleGrid.size(), n = obstacleGrid[0].size();vector<vector<int>> dp(m, vector<int>(n, 0));for (int i = 0; i < m && obstacleGrid[i][0] != 1; i++){dp[i][0] = 1;}for (int i = 0; i < n && obstacleGrid[0][i] != 1; i++){dp[0][i] = 1;}for (int i = 1; i < m; i++){for (int j = 1; j < n; j++){if (obstacleGrid[i][j] != 1){dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}}return dp[m - 1][n - 1];}
};int main()
{Solution s;vector<vector<int>> obstacleGrid = {{0,0,0},{0,1,0},{0,0,0}};cout << s.uniquePathsWithObstacles(obstacleGrid) << endl;obstacleGrid = {{0,1,0},{0,0,0}};cout << s.uniquePathsWithObstacles(obstacleGrid) << endl;return 0;
} 

代码3: 

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int uniquePathsWithObstacles(vector<vector<int>> &obstacleGrid){if (obstacleGrid.size() == 0 || obstacleGrid[0].size() == 0)return 0;int m = obstacleGrid.size();int n = obstacleGrid[0].size();vector<vector<int>> info(m, vector<int>(n, 0));for (int i = 0; i < m; ++i){if (obstacleGrid[i][0] == 1){for (int j = i; j < m; j++){info[j][0] = 0;}break;}elseinfo[i][0] = 1;}for (int i = 0; i < n; ++i){if (obstacleGrid[0][i] == 1){for (int j = i; j < n; ++j){info[0][j] = 0;}break;}elseinfo[0][i] = 1;}for (int i = 1; i < m; ++i){for (int j = 1; j < n; ++j){if (obstacleGrid[i][j] == 1){info[i][j] = 0;}else{info[i][j] = info[i - 1][j] + info[i][j - 1];}}}return info[m - 1][n - 1];}
};int main()
{Solution s;vector<vector<int>> obstacleGrid = {{0,0,0},{0,1,0},{0,0,0}};cout << s.uniquePathsWithObstacles(obstacleGrid) << endl;obstacleGrid = {{0,1,0},{0,0,0}};cout << s.uniquePathsWithObstacles(obstacleGrid) << endl;return 0;
} 

代码4: 

#include <bits/stdc++.h>
using namespace std;class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>> &obstacleGrid) {int m = obstacleGrid.size(), n = obstacleGrid[0].size();if (obstacleGrid[0][0] == 1 || obstacleGrid[m - 1][n - 1] == 1)return 0;vector<vector<int>> dp(m, vector<int>(n, 0));dp[0][0] = 1;for (int i = 1; i < m; i++) {if (obstacleGrid[i][0] == 0)dp[i][0] = dp[i - 1][0];}for (int i = 1; i < n; i++) {if (obstacleGrid[0][i] == 0)dp[0][i] = dp[0][i - 1];}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (obstacleGrid[i][j] == 0)dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
};int main()
{Solution s;vector<vector<int>> obstacleGrid = {{0,0,0},{0,1,0},{0,0,0}};cout << s.uniquePathsWithObstacles(obstacleGrid) << endl;obstacleGrid = {{0,1,0},{0,0,0}};cout << s.uniquePathsWithObstacles(obstacleGrid) << endl;return 0;
} 

64. 最小路径和

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例 1:

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 100

代码1:

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int minPathSum(vector<vector<int>> &grid){if (grid.size() == 0)return 0;int m = grid.size();int n = grid[0].size();vector<vector<int>> m_memo = vector<vector<int>>(m + 1, vector<int>(n + 1, 0));for (int i = n - 1; i >= 0; --i)m_memo[m - 1][i] = grid[m - 1][i] + m_memo[m - 1][i + 1];for (int j = m - 1; j >= 0; --j)m_memo[j][n - 1] = grid[j][n - 1] + m_memo[j + 1][n - 1];for (int i = m - 2; i >= 0; --i){for (int j = n - 2; j >= 0; --j){m_memo[i][j] = grid[i][j] + min(m_memo[i][j + 1], m_memo[i + 1][j]);}}return m_memo[0][0];}
};int main()
{Solution s;vector<vector<int>> grid = {{1,3,1},{1,5,1},{4,2,1}};cout << s.minPathSum(grid) << endl;grid = {{1,2,3},{4,5,6}};cout << s.minPathSum(grid) << endl;return 0;
} 

代码2: 

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int minPathSum(vector<vector<int>> &grid){int row = grid.size();int column = grid[0].size();for (int i = 1; i < column; ++i){grid[0][i] = grid[0][i - 1] + grid[0][i];}for (int i = 1; i < row; ++i){grid[i][0] = grid[i - 1][0] + grid[i][0];}for (int i = 1; i < row; ++i){for (int j = 1; j < column; ++j){int temp = grid[i - 1][j] > grid[i][j - 1] ? grid[i][j - 1] : grid[i - 1][j];grid[i][j] = grid[i][j] + temp;}}return grid[row - 1][column - 1];}
};int main()
{Solution s;vector<vector<int>> grid = {{1,3,1},{1,5,1},{4,2,1}};cout << s.minPathSum(grid) << endl;grid = {{1,2,3},{4,5,6}};cout << s.minPathSum(grid) << endl;return 0;
} 

代码3: 

#include <bits/stdc++.h>
using namespace std;class Solution
{
public:int minPathSum(vector<vector<int>> &grid){int row = grid.size();int col = grid[0].size();vector<int> f(col, 0);for (int i = 0; i < row; ++i){f[0] = f[0] + grid[i][0];for (int j = 1; j < col; ++j){if (i == 0)f[j] = f[j - 1] + grid[i][j];elsef[j] = min(f[j - 1], f[j]) + grid[i][j];}}return f[col - 1];}
};int main()
{Solution s;vector<vector<int>> grid = {{1,3,1},{1,5,1},{4,2,1}};cout << s.minPathSum(grid) << endl;grid = {{1,2,3},{4,5,6}};cout << s.minPathSum(grid) << endl;return 0;
} 

代码4: 

#include <bits/stdc++.h>
using namespace std;class Solution {
private:int m, n;int memo[100][100];
public:int minPathSum(vector<vector<int>> &grid) {m = grid.size(), n = grid[0].size();for (int i = 0; i < m; i++) {memset(memo[i], -1, sizeof(int) * n);}return dfs(grid, 0, 0);}int dfs(vector<vector<int>> &grid, int r, int c) {if (r < 0 || r >= m || c < 0 || c >= n)return 1000000;if (memo[r][c] != -1)return memo[r][c];if (r == m - 1 && c == n - 1) {memo[r][c] = grid[m - 1][n - 1];return memo[r][c];}int right = dfs(grid, r, c + 1);int down = dfs(grid, r + 1, c);memo[r][c] = min(right, down) + grid[r][c];return memo[r][c];}
};int main()
{Solution s;vector<vector<int>> grid = {{1,3,1},{1,5,1},{4,2,1}};cout << s.minPathSum(grid) << endl;grid = {{1,2,3},{4,5,6}};cout << s.minPathSum(grid) << endl;return 0;
} 

续:https://hannyang.blog.csdn.net/article/details/132091605

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

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

相关文章

JavaScript原生将图片转成base64

1.写个html文件 <!-- 产品照片 --> <div class"mb-3"> <label for"cover" class"form-label">产品图片</label><inputtype"file"class"form-control"id"coverfile"/> </div>…

深度学习——LSTM解决分类问题

RNN基本介绍 概述 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种深度学习模型&#xff0c;主要用于处理序列数据&#xff0c;如文本、语音、时间序列等具有时序关系的数据。 核心思想 RNN的关键思想是引入了循环结构&#xff0c;允许…

在线五子棋对战

目录 数据管理模块&#xff08;数据库设计&#xff09; 前端界面模块 业务处理模块 会话管理模块网络通信模块(session,cookie) 在线管理模块 房间管理模块 用户匹配模块 项目扩展 数据管理模块&#xff08;数据库设计&#xff09; 数据库中有可能存在很多张表&#xf…

Vue3文本省略(Ellipsis)

APIs 参数说明类型默认值必传maxWidth文本最大宽度number | string‘100%’falseline最大行数numberundefinedfalsetrigger展开的触发方式‘click’undefinedfalsetooltip是否启用文本提示框booleantruefalsetooltipMaxWidth提示框内容最大宽度&#xff0c;单位px&#xff0c;…

七大经典比较排序算法

1. 插入排序 (⭐️⭐️) &#x1f31f; 思想&#xff1a; 直接插入排序是一种简单的插入排序法&#xff0c;思想是是把待排序的数据按照下标从小到大&#xff0c;依次插入到一个已经排好的序列中&#xff0c;直至全部插入&#xff0c;得到一个新的有序序列。例如&#xff1a;…

计算机视觉与图形学-神经渲染专题-第一个基于NeRF的自动驾驶仿真平台

如今&#xff0c;自动驾驶汽车可以在普通情况下平稳行驶&#xff0c;人们普遍认识到&#xff0c;真实的传感器模拟将在通过模拟解决剩余的极端情况方面发挥关键作用。为此&#xff0c;我们提出了一种基于神经辐射场&#xff08;NeRF&#xff09;的自动驾驶模拟器。与现有作品相…

Python爬虫—破解JS加密的Cookie

前言 在进行网站数据爬取时&#xff0c;很多网站会使用JS加密来保护Cookie的安全性&#xff0c;而为了防止被网站反爬虫机制识别出来&#xff0c;我们通常需要使用代理IP来隐藏我们的真实IP地址。 本篇文章将介绍如何结合代理IP破解JS加密的Cookie&#xff0c;主要包括以下几个…

DDS中间件设计

OpenDDS、FastDDS数据分发服务中间件设计 软件架构 应用层DDS层RTPS层传输层 软件层次 FastDDS整体架构如下&#xff0c;这里可以看到DDS和RTPS的关系。另外缺少一部分IDL&#xff08;统一描述语言&#xff09;&#xff0c;其应该是Pub、Sub的反序列化、序列化工具。 在RT…

RabbitMQ 备份交换机和死信交换机

为处理生产者生产者将消息推送到交换机中&#xff0c;交换机按照消息中的路由键即自身策略无法将消息投递到指定队列中造成消息丢失的问题&#xff0c;可以使用备份交换机。 为处理在消息队列中到达TTL的过期消息&#xff0c;可采用死信交换机进行消息转存。 通过上述描述可知&…

vue 图片回显标签

第一种 <el-form-item label"打款银行回单"><image-preview :src"form.bankreceiptUrl" :width"120" :height"120"/></el-form-item>// 值为 https://t11.baidu.com/it/app106&fJPEG&fm30&fmtauto&…

【OJ比赛日历】快周末了,不来一场比赛吗? #08.05-08.11 #15场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-08-05&#xff08;周六&#xff09; #7场比赛2023-08-06…

电商系统架构设计系列(七):如何构建一个电商的商品搜索系统?

上篇文章中&#xff0c;我给你留了一个思考题&#xff1a;如何构建一个商品搜索系统&#xff1f; 今天这篇文章&#xff0c;我们来说一下电商的商品搜索系统。 引言 搜索这个特性可以说是无处不在&#xff0c;现在很少有网站或者系统不提供搜索功能了&#xff0c;所以&#xf…

Django的生命周期流程图(补充)、路由层urls.py文件、无名分组和有名分组、反向解析(无名反向解析、有名反向解析)、路由分发、伪静态

一、orm的增删改查方法&#xff08;补充&#xff09; 1. 查询resmodels.表名(类名).objects.all()[0]resmodels.表名(类名).objects.filter(usernameusername, passwordpassword).all()res models.表名(类名).objects.first() # 判断&#xff0c;判断数据是否有# res如果查询…

三、基本流程控制结构

3.1结构化程序设计 基本控制结构&#xff1a; 顺序结构选择结构循环结构 C语句&#xff1a; 说明语句控制语句函数调用语句表达式语句空语句复合语句 3.2选择结构语句 if语句&#xff1a; &#xff08;1&#xff09;单选条件语句 if(表达式) 语句 if(x>y) cout<&l…

DASCTF 2023 0X401七月暑期挑战赛web复现

目录 <1> Web (1) EzFlask(python原型链污染&flask-pin) (2) MyPicDisk(xpath注入&文件名注入) (3) ez_cms(pearcmd文件包含) (4) ez_py(django框架 session处pickle反序列化) <1> Web (1) EzFlask(python原型链污染&flask-pin) 进入题目 得到源…

SpringBoot统一功能处理

我们要实现以下3个目标&#xff1a; 统一用户登录权限统一数据格式返回统一异常处理 1.用户的登录权限校验 1.1Spring AOP用户统一登录验证问题 Aspect Component public class UserAspect {// 定义切点controller包下、子孙包下所有类的所有方法Pointcut("execution(…

使用多数据源dynamic-datasource-spring-boot-starter遇到的问题记录

记录使用多数据源dynamic-datasource-spring-boot-starter遇到的问题&#xff1a; 1、工程启动失败 缺少clickhouse连接驱动&#xff0c;引入对应的maven依赖 <!--ck连接驱动--><dependency><groupId>ru.yandex.clickhouse</groupId><artifactId>…

webshell详解

Webshell详解 一、 Webshell 介绍二 、 基础常见webshell案例 一、 Webshell 介绍 概念 webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境&#xff0c;也可以将其称做为一种网页后门。黑客在入侵了一个网站后&#xff0c;通常会将asp或php后门文件与…

国标GB28181安防视频平台EasyGBS大批量通道接入后,创建角色接口未响应的排查

国标GB28181协议视频平台EasyGBS是基于国标GB28181协议的视频云服务平台&#xff0c;支持多路设备同时接入&#xff0c;并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可提供视频监控直播、云端录像、云存储、检索回放、智能告警、语音对讲、平台级…

【并发专题】操作系统模型及三级缓存架构

目录 课程内容一、冯诺依曼计算机模型详解1.计算机五大核心组成部分2.CPU内部结构3.CPU缓存结构4.CPU读取存储器数据过程5.CPU为何要有高速缓存 学习总结 课程内容 一、冯诺依曼计算机模型详解 现代计算机模型是基于-冯诺依曼计算机模型 计算机在运行时&#xff0c;先从内存中…