首页 > 其他分享 >动态规划 -- 路径问题

动态规划 -- 路径问题

时间:2023-05-27 23:34:29浏览次数:38  
标签:return -- 路径 int grid 动态 col dp row

#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;
// https://leetcode.cn/problems/dungeon-game/
class Solution
{
public:
  int process1(int x, int y, int row, int col, vector<vector<int>> &grid)
  {
    if (x == row || y == col)
      return INT32_MAX;
    if (x == row - 1 && y == col - 1)
    {
      return std::max(1 - grid[x][y], 1);
    }

    int p1 = process1(x + 1, y, row, col, grid);
    int p2 = process1(x, y + 1, row, col, grid);

    return std::max(std::min(p1, p2) - grid[x][y], 1);
  }

  int process2(vector<vector<int>> &grid)
  {
    int row = grid.size();
    int col = grid.back().size();
    vector<vector<int>> dp(row + 1, vector<int>(col + 1, INT32_MAX));
    dp[row - 1][col - 1] = std::max((1 - grid[row - 1][col - 1]) % INT32_MAX, 1);
    for (int i = row - 1; i >= 0; i--)
    {
      for (int j = col - 1; j >= 0; j--)
      {
        if (i == row - 1 && j == col - 1)
          continue;
        dp[i][j] = std::max((std::min(dp[i + 1][j], dp[i][j + 1]) - grid[i][j]) % INT32_MAX, 1);
      }
    }
    return dp[0][0];
  }

  int calculateMinimumHP(vector<vector<int>> &grid)
  {
    // 假设都是负数,我们应该求的是最大的路径和
    if (grid.empty())
      return 0;
    int row = grid.size();
    int col = grid.back().size();
    // return process1(0, 0, row, col, grid);
    return process2(grid);
  }
};
// https://leetcode.cn/problems/minimum-path-sum/submissions/
class Solution
{
public:
  int process1(int x, int y, int row, int col, vector<vector<int>> &grid)
  {
    if (x == row || col == y)
      return INT32_MAX;
    if (x == row - 1 && y == col - 1)
      return grid[x][y];
    int p1 = process1(x + 1, y, row, col, grid);
    int p2 = process1(x, y + 1, row, col, grid);
    return grid[x][y] + std::min(p1, p2);
  }
  int process2(vector<vector<int>> &grid)
  {
    int row = grid.size();
    int col = grid.back().size();
    vector<vector<int>> dp(row + 1, vector<int>(col + 1, INT32_MAX));
    dp[row - 1][col - 1] = grid[row - 1][col - 1];
    for (int i = row - 1; i >= 0; i--)
    {
      for (int j = col - 1; j >= 0; j--)
      {
        if (i == row - 1 && j == col - 1)
          continue;
        dp[i][j] = std::min(dp[i + 1][j], dp[i][j + 1]) + grid[i][j];
      }
    }
    return dp[0][0];
  }
  int process3(vector<vector<int>> &grid)
  {
    int row = grid.size();
    int col = grid.back().size();
    // 一某一个位置为结尾
    vector<vector<int>> dp(row + 1, vector<int>(col + 1, INT32_MAX));

    // 初始化
    dp[0][1] = 0;
    for (size_t i = 1; i <= row; i++)
    {
      for (size_t j = 1; j <= col; j++)
      {
        dp[i][j] = std::min(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
      }
    }
    return dp[row][col];
  }
  int minPathSum(vector<vector<int>> &grid)
  {
    if (grid.empty())
      return 0;
    int row = grid.size();
    int col = grid.back().size();
    // return process1(0, 0, row, col, grid);
    // return process2(grid);
    return process3(grid);
  }
};
// https://leetcode.cn/problems/minimum-falling-path-sum/

// class Solution
// {
// public:
//   int process(int x, int y, int row, int col, const vector<vector<int>> &matrix)
//   {

//     if (y < 0 || y == col)
//       return INT32_MAX;

//     if (x == row - 1)
//       return matrix[x][y];

//     int p1 = process(x + 1, y, row, col, matrix);
//     int p2 = process(x + 1, y - 1, row, col, matrix);
//     int p3 = process(x + 1, y + 1, row, col, matrix);

//     return matrix[x][y] + std::min(p1, std::min(p2, p3)) % INT32_MAX;
//     ;
//   }
//   int process2(const vector<vector<int>> &matrix)
//   {

//     int row = matrix.size();
//     int col = matrix.back().size();
//     vector<vector<int>> dp(row + 1, vector<int>(col + 1 + 1, INT32_MAX));
//     for (int i = row - 1; i >= 0; i--)
//     {
//       for (int j = 1; j <= col; j++)
//       {
//         dp[i][j] = std::min(dp[i + 1][j], std::min(dp[i + 1][j - 1], dp[i + 1][j + 1])) % INT32_MAX + matrix[i][j - 1];
//       }
//     }
//     int result = dp[0][1];
//     for (int i = 2; i <= col; i++)
//     {
//       result = std::min(result, dp[0][i]);
//     }
//     return result;
//   }

//   int process3(const vector<vector<int>> &matrix)
//   {
//     int row = matrix.size();
//     int col = matrix.back().size();
//     vector<vector<int>> dp(row + 1, vector<int>(col + 2, INT32_MAX));
//     // 初始化
//     for (int i = 0; i < col + 2; i++)
//     {
//       dp[0][i] = 0;
//     }

//     // 填表
//     for (int i = 1; i <= row; i++)
//     {
//       for (int j = 1; j <= col; j++)
//       {
//         dp[i][j] =std::min(dp[i - 1][j], std::min(dp[i - 1][j - 1], dp[i - 1][j + 1])) % INT32_MAX + matrix[i-1][j - 1];
//       }
//     }
//     int result = dp[row][1];
//     for (int i = 2; i <= col; i++)
//     {
//       result = std::min(result, dp[row][i]);
//     }
//     return result;
//   }

//   int minFallingPathSum(vector<vector<int>> &matrix)
//   {
//     if (matrix.empty())
//       return 0;

//     // return process2(matrix);
//     return process3(matrix);
//   }
// int minFallingPathSum(vector<vector<int>> &matrix)
// {
//   if (matrix.empty())
//     return 0;
//   int row = matrix.size();
//   int col = matrix.back().size();
//   int num = INT32_MAX;
//   for (int i = 0; i < col; i++)
//   {
//     int ret = process(0, i, row, col, matrix);
//     // cout<< ret << endl;
//     if (ret < num)
//       num = ret;
//   }
//   return num;
// }
// };

// https://leetcode.cn/problems/li-wu-de-zui-da-jie-zhi-lcof/
// class Solution {
// public:
//  int process1(int x, int y, int row, int col, const vector<vector<int>>& grid)
//  {
//    if(x == row)
//      return 0;
//    if(y == col)
//      return 0;
//    if(x == row-1 && y == col-1)
//      return grid[x][y];
//    int p1 = process1(x+1, y, row, col, grid);
//    int p2 = process1(x, y+1, row, col, grid);
//    return grid[x][y] + std::max(p1, p2);
//  }
//
//  int process2(const vector<vector<int>>& grid)
//  {
//    int row = grid.size();
//    int col = grid.back().size();
//    vector<vector<int>> dp(row+1, vector<int>(col+1, 0));
//    dp[row-1][col-1] = grid[row-1][col-1];
//    for(int i = row-1; i >= 0; i--)
//    {
//      for(int j = col-1; j >= 0; j--)
//      {
//        if(i == row-1 && j == col-1)
//          continue;
//        dp[i][j] = std::max(dp[i+1][j], dp[i][j+1]) + grid[i][j];
//      }
//    }
//    return dp[0][0];
//  }
//  int process3(const vector<vector<int>>& grid)
//  {
//    // 状态定义
//    // 以dpp[i][j]为结尾,我们礼物的最大的价值
//    // 状态方程
//    // dp[i][j] = max(dp[i-1[j], dp[i][j]) + giedp[i][j]
//    // 初始化
//    // 填表顺序
//    // 返回值
//    int row = grid.size();
//    int col = grid.back().size();
//    vector<vector<int>> dp(row+1, vector<int>(col+1, 0));
//    for(int i = 1; i <= row; i++)
//    {
//      for(int j = 1; j <= col; j++)
//      {
//        dp[i][j] = std::max(dp[i-1][j], dp[i][j-1]) + grid[i-1][j-1];
//      }
//    }
//    return dp[row][col];
//  }
//
//  int maxValue(vector<vector<int>>& grid) {
//      if(grid.empty())
//        return 0;
//      return process2(grid);
//    }
//};

// https://leetcode.cn/problems/unique-paths-ii/

// class Solution
// {
// public:
//   // 在[row][col]处走,到达最下方我们的路径个数
//   int process(int row, int col, int rowLen, int colLen, vector<vector<int>> &obstacleGrid)
//   {
//     if (row == rowLen && col == colLen && obstacleGrid[row][col] == 0)
//       return 1; // 路径是对的
//     if (row > rowLen || col > colLen)
//       return 0;

//     // 这里我们走正常的
//     if (obstacleGrid[row][col] == 1)
//     {
//       return 0; // 表明此路不通
//     }
//     // 向下走
//     int p1 = process(row + 1, col, rowLen, colLen, obstacleGrid);
//     // 向右走
//     int p2 = process(row, col + 1, rowLen, colLen, obstacleGrid);
//     return p1 + p2;
//   }
//   // row [0, n] col [0, m]
//   long long process2(const vector<vector<int>> &obstacleGrid)
//   {
//     int n = obstacleGrid.size();
//     int m = obstacleGrid[0].size();
//     std::vector<std::vector<long long>> dp(n + 1, std::vector<long long>(m + 1));

//     // 初始化
//     if (obstacleGrid[n - 1][m - 1] == 0)
//       dp[n - 1][m - 1] = 1;
//     else
//       dp[n - 1][m - 1] = 0;
//     for (int i = n - 1; i >= 0; i--)
//     {
//       for (int j = m - 1; j >= 0; j--)
//       {
//         if (i == n - 1 && j == m - 1)
//           continue;
//         if (obstacleGrid[i][j] == 0)
//           dp[i][j] = dp[i + 1][j] + dp[i][j + 1];
//       }
//     }
//     return dp[0][0];
//   }

//   int uniquePathsWithObstacles(vector<vector<int>> &obstacleGrid)
//   {
//     if (obstacleGrid.empty())
//       return 0;
//     int m = obstacleGrid.size();
//     int n = obstacleGrid[0].size();
//     if (m <= 0 || n <= 0)
//       return 0;
//     std::vector<std::vector<int>> dp(m + 1, std::vector<int>(n + 1, 0));
//     // 初始化
//     dp[0][1] = 1;
//     for (int i = 1; i < m + 1; i++)
//     {
//       for (int j = 1; j < n + 1; j++)
//       {
//         if (obstacleGrid[i - 1][j - 1] == 0)
//           dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
//       }
//     }
//     return dp[m][n];
//     // return process2(obstacleGrid);
//     // int row = obstacleGrid.size();
//     // int col = obstacleGrid[0].size();
//     // return process(0, 0, row - 1, col - 1, obstacleGrid);
//   }
// };

// https://leetcode.cn/problems/unique-paths/
// class Solution
// {
// public:
//   int uniquePaths(int m, int n)
//   {
// if (m <= 0 || n <= 0)
//   return 0;
// std::vector<std::vector<int>> dp(m + 1, std::vector<int>(n + 1, 0));
// // 初始化
// dp[0][1] = 1;
// for (int i = 1; i < m + 1; i++)
// {
//   for (int j = 1; j < n + 1; j++)
//   {
//     dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
//   }
// }
// return dp[m][n];
//   }
// };

// class Solution {
// public:
//     // 这是一个尝试,startx, starty 是我们当前所在的位置
//     //  aimx, aimy 是我们的目标
//     // 返回值是我们的路径数
//     int process1(int startx, int starty, int aimx, int aimy)
//     {
//         if (startx > aimx)
//             return 0;
//         if (starty > aimy)
//             return 0;
//         if (startx == aimx && starty == aimy)
//             return 1;
//         int p1 = process1(startx + 1, starty, aimx, aimy);
//         int p2 = process1(startx, starty+1, aimx, aimy);
//         return p1 + p2;
//     }
//     // startx[0, m] starty[0, n]
//     int process2(int m, int n)
//     {
//         std::vector<std::vector<int>> dp(m + 1, std::vector<int>(n + 1, 0));
//         dp[m-1][n-1] = 1;
//         for (int i = m-1; i >= 0; i--)
//         {
//             for (int j = n-1; j >= 0; j--)
//             {
//                 if (i == m-1 && j == n-1)
//                     continue;
//                 dp[i][j] = dp[i + 1][j] + dp[i][j + 1];
//             }
//         }
//         return dp[0][0];
//     }
//     int uniquePaths(int m, int n) {
//         //return process1(0, 0, m - 1, n - 1);
//         return process2(m,n);
//     }
// };

标签:return,--,路径,int,grid,动态,col,dp,row
From: https://blog.51cto.com/byte/6363254

相关文章

  • 模糊检测(转载)
    转载https://blog.csdn.net/baidu_31657889/article/details/84671927模糊检测      模糊估计分为两个步骤:首先是边缘检测,然后是模糊确定。此处模糊估计是通过计算当前像素点与领域内像素点均值之差来确定。我们用f(x,y)表示图片,其中。定义水平绝对差如下:整个图片的水......
  • Android 服务Service详解
    Android服务(Service)是一种在后台运行的组件,它可以在不与用户交互的情况下执行长时间运行的操作。服务通常用于在后台播放音乐、下载数据、执行网络操作等。服务的特点如下:1.服务是一种后台运行的组件,可以在不与用户交互的情况下执行长时间运行的操作。2.服务可以在应用程序的......
  • MyCat19——搭建MyCat高可用集群
    1HAProxy单点故障在上一篇文章里,我们在一台机器上安装了HAProxy,实现了MyCat服务的集群。但是这样的架构中,只有一个HAProxy服务,一旦这个服务发生了宕机,集群将不可用,这就是所谓的单点故障。那么怎么进一步提高HAProxy的高可用,从而解决单点故障的问题呢?通过Keepalived可以实现。2解......
  • 从已知文件内容匹配删除目标文件的内容
    脚本内容删除脚本whileIFS=read-rip;doecho-e"\e[1;32m$ip\e[0m"&&sed-i"/$ip/d"nodedone<a校验脚本whileIFS=read-rip;doifgrep-q"$ip"node;thenecho-e"\e[1;32mIP地址$ip存在于node文件中\e[0m......
  • 开源可观测性平台Signoz【日志采集篇】
    转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。原创不易,请文明转载,谢谢。在开源可观测性平台Signoz系列【开篇】中,介绍了signoz的基础理论知识、安装部署及一些初始化配置。本文则记录signoz怎么采集日志,包括docker容器日志和主机日志1.收集容器日志1.1收......
  • nas盒子内网穿透
    2023年5月27日星期六---------------------------------------------------------------------------------------------------------------------------本教程也适用于linux服务器的内网穿透使用https://freefrp.net/免费服务器地址这里我使用圣何赛,第一步:将自己的域名cn......
  • 允许Traceroute探测漏洞修复
    vim/etc/sysconfig/iptables-AINPUT-picmp-micmp--icmp-typetime-exceeded-jDROP-AOUTPUT-picmp-micmp--icmp-typetime-exceeded-jDROP重启iptables服务:systemctlrestartiptables检查新添加的规则是否有效,检查命令:iptables-L-n......
  • Anaconda正确安装pytorch正确步骤
    前提:Anaconda安装的10个坑1没有系统环境变量(有的安装包没有系统环境变量,勾选安装,需要自己配置环境变量,否则会后面会让你重新安装)2安装pytorch前,要condaactivatemyenv//激活环境,不然安装默认路径,用不了,白安装了 第一步一劳永逸,设置镜像源pipconfigsetglobal.index-......
  • HCIP学习笔记-数据库服务规划-5
    1.数据库服务概览1.1数据库发展趋势数据规模爆炸式增长,数据应用模式不断丰富。云计算大规模应用,传统业务模式发生转变。1.2云数据库优势相比传统数据库,云数据库一般具有以下有点易用性:云数据库一般也是作为一个云服务提供,与其他云服务一样,可以快速部署和运行,同时一般还可以免......
  • AIGC赛道5种不同的营收模式
    1,MaaS(ModelasService) 适用于底层大模型和中间层进行变现,按照数据请求量和实际计算量计算。到2027年,MaaS模式占市场规模比例将从5%增长至47%。2,按产出内容量收费适用于应用层变现,如按图片张数、请求计算量、模型训练次数等收费。到2027年,该模式市场规模占比将从60%......