从矩阵左上角到右下角的最大点,然后以C ++返回

在本教程中,我们将讨论一个从矩阵左上角到右下角找到最大点并返回的点的程序。

为此,我们将提供由#块路径,*点,.-允许路径组成的矩阵。我们的任务是从一个角移动到另一个角(向右下方移动)并返回(向左和顶部向上移动),以便收集最大点数

示例

#include <bits/stdc++.h>

#define MAX 5

#define N 5

#define M 5

#define inf 100000

using namespace std;

//计算点

int cost(char grid[][M], int row1, int col1, int row2, int col2) {

   if (row1 == row2 && col1 == col2) {

      if (grid[row1][col1] == '*')

         return 1;

      return 0;

   }

   int ans = 0;

   if (grid[row1][col1] == '*')

      ans++;

   if (grid[row2][col2] == '*')

      ans++;

   return ans;

}

//计算最高分

int solve(int n, int m, char grid[][M], int dp[MAX][MAX][MAX], int row1, int col1, int row2) {

   int col2 = (row1 + col1) - (row2);

   if (row1 == n - 1 && col1 == m - 1 && row2 == n - 1 && col2 == m - 1)

      return 0;

   if (row1 >= n || col1 >= m || row2 >= n || col2 >= m)

      return -1 * inf;

   if (dp[row1][col1][row2] != -1)

      return dp[row1][col1][row2];

   int ch1 = -1 * inf, ch2 = -1 * inf;

   int ch3 = -1 * inf, ch4 = -1 * inf;

   if (grid[row1][col1 + 1] != '#' &&

      grid[row2 + 1][col2] != '#')

   ch1 = cost(grid, row1, col1 + 1, row2 + 1, col2) + solve(n, m, grid, dp, row1, col1 + 1, row2 + 1);

   if (grid[row1][col1 + 1] != '#' &&

      grid[row2][col2 + 1] != '#')

   ch2 = cost(grid, row1, col1 + 1, row2, col2 + 1) + solve(n, m, grid, dp, row1, col1 + 1, row2);

   if (grid[row1 + 1][col1] != '#' &&

      grid[row2][col2 + 1] != '#')

   ch3 = cost(grid, row1 + 1, col1, row2, col2 + 1) + solve(n, m, grid, dp, row1 + 1, col1, row2);

   if (grid[row1 + 1][col1] != '#' &&

      grid[row2 + 1][col2] != '#')

   ch4 = cost(grid, row1 + 1, col1, row2 + 1, col2) + solve(n, m, grid, dp, row1 + 1, col1, row2 + 1);

   return dp[row1][col1][row2] = max({ch1, ch2, ch3, ch4});

}

int wrapper(int n, int m, char grid[N][M]) {

   int ans = 0;

   int dp[MAX][MAX][MAX];

   memset(dp, -1, sizeof dp);

   if (grid[n - 1][m - 1] == '#' || grid[0][0] == '#')

      ans = -1 * inf;

   if (grid[0][0] == '*')

      ans++;

   grid[0][0] = '.';

   if (grid[n - 1][m - 1] == '*')

      ans++;

   grid[n - 1][m - 1] = '.';

   ans += solve(n, m, grid, dp, 0, 0, 0);

   return max(ans, 0);

}

int main() {

   int n = 5, m = 5;

   char grid[N][M] = {

      { '.', '*', '.', '*', '.' },

      { '*', '#', '#', '#', '.' },

      { '*', '.', '*', '.', '*' },

      { '.', '#', '#', '#', '*' },

      { '.', '*', '.', '*', '.' }

   };

   cout << wrapper(n, m, grid) << endl;

   return 0;

}

输出结果

8

以上是 从矩阵左上角到右下角的最大点,然后以C ++返回 的全部内容, 来源链接: utcz.com/z/341032.html

回到顶部