数据结构与算法——动态规划

目录

  • 例1:爬楼梯(easy)
  • 例2:打家劫舍(easy)
  • 例3:最大字段和(easy)
  • 例4:找零钱(medium)
  • 例5:三角形(medium)
  • 例6:最长上升子序列(medium,hard)
  • 例7:最小路径和(medium)
  • 例8:地牢游戏(hard)

例1:爬楼梯(easy)

数据结构与算法——动态规划_第1张图片
数据结构与算法——动态规划_第2张图片

class Solution {
public:
 int climbStairs(int n) {
  vector<int>dp(n + 3, 0);
  dp[1] = 1;
  dp[2] = 2;
  for (int i = 3; i <= n; i++) {
   dp[i] = dp[i - 1] + dp[i - 2];
  }
  return dp[n];
 }
};

例2:打家劫舍(easy)

数据结构与算法——动态规划_第3张图片
数据结构与算法——动态规划_第4张图片

class Solution {
public:
 int rob(vector<int>& nums) {
  if (nums.size() == 0) {
   return 0;
  }
  if (nums.size() == 1) {
   return nums[0];
  }
  vector<int> dp(nums.size(), 0);
  dp[0] = nums[0];
  dp[1] = max(nums[0], nums[1]);
  for (int i = 2; i < nums.size(); i++) {
   dp[i] = max(dp[i - 1], nums[i] + dp[i - 2]);
  }
  return dp[nums.size() - 1];
 }
};

例3:最大字段和(easy)

数据结构与算法——动态规划_第5张图片
数据结构与算法——动态规划_第6张图片

class Solution {
public:
 int maxSubArray(vector<int>& nums) {
  vector<int>dp(nums.size(), 0);
  dp[0] = nums[0];
  int max_res = dp[0];
  for (int i = 1; i < nums.size(); i++) {
   dp[i] = max(dp[i - 1] + nums[i], nums[i]);
   if (dp[i] >= max_res) {
    max_res = dp[i];
   }
  }
  return max_res;
 }
};

例4:找零钱(medium)

数据结构与算法——动态规划_第7张图片

class Solution {
public:
 int coinChange(std::vector<int>& coins, int amount) {
  std::vector<int> dp(amount + 1, -1);
  dp[0] = 0;
  for (int i = 1; i <= amount; i++) {
   for (int j = 0; j < coins.size(); j++) {
    if (i - coins[j] >= 0 && dp[i - coins[j]] != -1) {
     if (dp[i] == -1 || dp[i] > dp[i - coins[j]] + 1) {
      dp[i] = dp[i - coins[j]] + 1;
     }
    }
   }
  }
  return dp[amount];
 }
};

例5:三角形(medium)

数据结构与算法——动态规划_第8张图片
数据结构与算法——动态规划_第9张图片

class Solution {
public:
 int minimumTotal(vector<vector<int>>& triangle) {
  vector<vector<int>> dp(triangle);
  for (int i = dp.size() - 2; i >= 0; i--) {
   for (int j = 0; j < dp[i].size(); j++) {
    dp[i][j] = std::min(dp[i + 1][j], dp[i + 1][j + 1]) + triangle[i][j];
   }
  }
  return dp[0][0];
 }
};

例6:最长上升子序列(medium,hard)

数据结构与算法——动态规划_第10张图片

数据结构与算法——动态规划_第11张图片

class Solution {
public:
 int lengthOfLIS(vector<int>& nums) {
  if (nums.size() == 0) {
   return 0;
  }
  vector<int>stack;
  stack.push_back(nums[0]);
  for (int i = 1; i < nums.size(); i++) {
   if (nums[i] > stack.back()) {
    stack.push_back(nums[i]);
   }
   else {
    for (int j = 0; j < stack.size(); j++) {
     if (stack[j] >= nums[i]) {
      stack[j] = nums[i];
      break;
     }
    }
   }
  }
  return stack.size();
 }
};

数据结构与算法——动态规划_第12张图片

class Solution {
public:
 int lengthOfLIS(vector<int>& nums) {
  if (nums.size() == 0) {
   return 0;
  }
  vector<int>dp(nums.size(), 0);
  dp[0] = 1;
  int LIS = 1;
  for (int i = 1; i < nums.size(); i++) {
   dp[i] = 1;
   for (int j = 0; j < i; j++) {
    if (nums[i] > nums[j] && dp[i] < dp[j] + 1) {
     dp[i] = dp[j] + 1;
    }
   }
   if (LIS < dp[i]) {
    LIS = dp[i];
   }
  }
  return LIS;
 }
};

例7:最小路径和(medium)

数据结构与算法——动态规划_第13张图片

class Solution {
public:
 int minPathSum(vector<vector<int>>& grid) {
  if (grid.size() == 0) {
   return 0;
  }
  int row = grid.size();
  int column = grid[0].size();
  vector<vector<int>>dp(grid);
  dp[0][0] = grid[0][0];
  for (int i = 1; i < column; i++) {
   dp[0][i] = grid[0][i] + dp[0][i - 1];
  }
  for (int i = 1; i < row; i++) {
   dp[i][0] = grid[i][0] + dp[i - 1][0];
   for (int j = 1; j < column; j++) {
    dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
   }
  }
  return dp[row - 1][column - 1];
 }
};

例8:地牢游戏(hard)

数据结构与算法——动态规划_第14张图片

数据结构与算法——动态规划_第15张图片

class Solution {
public:
 int calculateMinimumHP(vector<vector<int>>& dungeon) {
  if (dungeon.size() == 0) {
   return 0;
  }
  vector<vector<int>> dp(dungeon);
  int row = dungeon.size();
  int column = dungeon[0].size();
  dp[row - 1][column - 1] = max(1, 1 - dungeon[row - 1][column - 1]);
  for (int i = column - 2; i >= 0; i--) {
   dp[row - 1][i] = max(1, dp[row - 1][i + 1] - dungeon[row - 1][i]);
  }
  for (int i = row - 2; i >= 0; i--) {
   dp[i][column - 1] = max(1, dp[i + 1][column - 1] - dungeon[i][column - 1]);
  }
  for (int i = row - 2; i >= 0; i--) {
   for (int j = column - 2; j >= 0; j--) {
    int dp_min = min(dp[i + 1][j], dp[i][j + 1]);
    dp[i][j] = max(1, dp_min - dungeon[i][j]);
   }
  }
  return dp[0][0];
 }
};

你可能感兴趣的:(数据结构与算法,算法,动态规划,数据结构)