LeetCode //C - 1301. Number of Paths with Max Score

1301. Number of Paths with Max Score

You are given a square board of characters. You can move on the board starting at the bottom right square marked with the character 'S'.

You need to reach the top left square marked with the character 'E'. The rest of the squares are labeled either with a numeric character 1, 2, ..., 9 or with an obstacle 'X'. In one move you can go up, left or up-left (diagonally) only if there is no obstacle there.

Return a list of two integers: the first integer is the maximum sum of numeric characters you can collect, and the second is the number of such paths that you can take to get that maximum sum, taken modulo 10^9 + 7.

In case there is no path, return 0, 0.

Example 1:

Input: board = "E23","2X2","12S"

Output: 7,1

Example 2:

Input: board = "E12","1X1","21S"

Output: 4,2

Example 3:

Input: board = "E11","XXX","11S"

Output: 0,0

Constraints:
  • 2 <= board.length == boardi.length <= 100

From: LeetCode

Link: 1301. Number of Paths with Max Score


Solution:

Ideas:

Use dynamic programming to store the maximum score and number of maximum-score paths reaching each cell.

Code:
c 复制代码
#include <stdlib.h>
#include <string.h>

#define MOD 1000000007

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* pathsWithMaxScore(char **board, int boardSize, int* returnSize) {
    int maxScore[100][100];
    int pathCount[100][100];

    for (int i = 0; i < boardSize; i++) {
        for (int j = 0; j < boardSize; j++) {
            maxScore[i][j] = -1;
            pathCount[i][j] = 0;
        }
    }

    maxScore[0][0] = 0;
    pathCount[0][0] = 1;

    for (int i = 0; i < boardSize; i++) {
        for (int j = 0; j < boardSize; j++) {
            if (board[i][j] == 'X' || (i == 0 && j == 0)) {
                continue;
            }

            int best = -1;
            long long ways = 0;

            /* Cell above */
            if (i > 0 && maxScore[i - 1][j] > best) {
                best = maxScore[i - 1][j];
                ways = pathCount[i - 1][j];
            } else if (i > 0 && maxScore[i - 1][j] == best && best != -1) {
                ways += pathCount[i - 1][j];
            }

            /* Cell to the left */
            if (j > 0 && maxScore[i][j - 1] > best) {
                best = maxScore[i][j - 1];
                ways = pathCount[i][j - 1];
            } else if (j > 0 && maxScore[i][j - 1] == best && best != -1) {
                ways += pathCount[i][j - 1];
            }

            /* Upper-left diagonal cell */
            if (i > 0 && j > 0 && maxScore[i - 1][j - 1] > best) {
                best = maxScore[i - 1][j - 1];
                ways = pathCount[i - 1][j - 1];
            } else if (i > 0 && j > 0 &&
                       maxScore[i - 1][j - 1] == best && best != -1) {
                ways += pathCount[i - 1][j - 1];
            }

            if (best == -1) {
                continue;
            }

            int value = 0;

            if (board[i][j] >= '1' && board[i][j] <= '9') {
                value = board[i][j] - '0';
            }

            maxScore[i][j] = best + value;
            pathCount[i][j] = ways % MOD;
        }
    }

    int* result = (int*)malloc(2 * sizeof(int));
    *returnSize = 2;

    if (maxScore[boardSize - 1][boardSize - 1] == -1) {
        result[0] = 0;
        result[1] = 0;
    } else {
        result[0] = maxScore[boardSize - 1][boardSize - 1];
        result[1] = pathCount[boardSize - 1][boardSize - 1];
    }

    return result;
}
相关推荐
小雉系统36 分钟前
BcoreOS安全通信架构:FsSession 抗算法后门安全设计
算法·安全·架构
§ꦿCFོ༉2 小时前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
唐墨1235 小时前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏5 小时前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
通信小呆呆10 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
笑容掩饰我的失落10 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black11 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
唐青枫13 小时前
C 语言 strcpy() 用法详解与实战 Demo
c语言
2601_9679791213 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程