C++ 地牢游戏 动态规划

已知一个二维数组,左上角代表骑士的位置,右下角代表公主的位置,二维数组中存储整数,整数可以给骑士增加生命值,负数会减少骑士的生命值,问骑士初始时至少是多少生命值,才可保证骑士在行走的过程中至少保持生命值为1。(骑士只能向下或向右行走)

#include<vector>
#include<algorithm>
class Solution
{
public:
 Solution() {}
 ~Solution() {}
 int calculationMinimunHP(std::vector<std::vector<int>>& dungeon) 
 {
  if (dungeon.size()==0)
  {
   return 0;
  }
  int row = dungeon.size();
  int column = dungeon[0].size();
  std::vector<std::vector<int>> dp(row, std::vector<int>(column, 0));
  dp[row - 1][column - 1] = std::max(1,1-dungeon[row-1][column-1]);
  for (int i = row-2; i >= 0; i--)
  {
   dp[i][column - 1] = std::max(1,dp[i+1][column-1]-dungeon[i][column-1]);
  }
  for (int i = column-2; i>=0; i--)
  {
   dp[row - 1][i] = std::max(1, dp[row - 1][i + 1] - dungeon[row - 1][i]);
  }
  for (int i = column-2; i >=0; i--)
  {
   for (int j = row-2; j >=0; j--)
   {
    int dp_min = std::min(dp[i+1][j], dp[i][j+1]);
    dp[i][j] = std::max(1, dp_min - dungeon[i][j]);
   }
  }
  return dp[0][0];
 }
};
int main()
{
 int test[][3] = { {-2,-3,3},{-5,-10,1},{10,30,-5} };
 std::vector<std::vector<int>> dungeon;
 for ( int i = 0; i < 3; i++)
 {
  dungeon.push_back(std::vector<int>());
  for (int j = 0; j < 3; j++)
  {
   dungeon[i].push_back(test[i][j]);
  }
 }
 Solution solve;
 printf("%d\n", solve.calculationMinimunHP(dungeon));
 return 0;
}

运行结果为:

7
发布了135 篇原创文章 · 获赞 121 · 访问量 4891

猜你喜欢

转载自blog.csdn.net/weixin_44208324/article/details/105145950