归这一算法主要用于解决实际问题中反复出现的结构和形式,从本质层面对其加以概括,提高算法的高效性,如Fibonacci数
class Solution {
public:
int climbStairs(int n) {
if(n<=1)
return 1;
else
return climbStairs(n-1)+climbStairs(n-2);
}
};
N皇后问题:https://leetcode-cn.com/problems/n-queens/submissions/
逆序数
class Solution {
public:
int kInversePairs(int n, int k) {
int m = 1000000007;
int dp[n + 1][k + 1];
// 初始化, 所有的取0个逆序对的情况都只有一种
for (int i = 0; i <= n; i++) {
dp[i][0] = 1;
}// 当有0个元素的时候,逆序对大于1的情况都是0
for (int i = 1; i <= k; i++) {
dp[0][i] = 0;
}// 开始为计算所有的dp元素
for (int row_n = 1; row_n <= n; row_n++) {
for (int col_k = 1; col_k <= k; col_k++) {
dp[row_n][col_k] = (dp[row_n - 1][col_k] + dp[row_n][col_k - 1]) % m;
if (col_k >= row_n) {
dp[row_n][col_k] = (dp[row_n][col_k] - dp[row_n - 1][col_k - row_n] + m) % m;
}
}
}
return dp[n][k];}
};
最小路径之和
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
for(int i=1; i<grid.size(); i++)
grid[i][0] += grid[i-1][0];
for(int j=1; j<grid[0].size(); j++)
grid[0][j] += grid[0][j-1];
for (int i=1; i<grid.size(); i++) {
for (int j=1; j<grid[0].size(); j++) {
grid[i][j] = min(grid[i][j-1], grid[i-1][j]) + grid[i][j];
}
}
return grid[grid.size()-1][grid[0].size()-1];
}
};
10.正则表达式:https://leetcode-cn.com/problems/regular-expression-matching/submissions/
152.乘积最大子序列:https://leetcode-cn.com/problems/maximum-product-subarray/submissions/
121.买卖股票的最佳时机:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int maxP=0;
for(int i=0;i<prices.size();++i)
{
for(int j=i+1;j<prices.size();++j)
{
int profit=prices[j]-prices[i];
if(maxP<profit)
{
maxP=profit;
}
}
}
return maxP;
}
};
120.三角形的最小路径之和:https://leetcode-cn.com/problems/triangle/submissions/