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;
}
相关推荐
卡卡~~2 小时前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法
学逆向的2 小时前
C 多文件开发
c语言·开发语言·网络安全
企业数字化笔记2 小时前
AI视频增强后画质怎么验收?插值基线、伪细节与帧间闪烁的检查方法
人工智能·算法·音视频
学逆向的2 小时前
C 内存属性
c语言·开发语言·算法·网络安全
Zwawa3 小时前
一盏 LED 不够用了:让同一盏灯说出不同的话
c语言·单片机·嵌入式
lengxuenong3 小时前
树状数组 · 信息学学习手册1-求和3个模板
c++·学习·算法·青少年编程
ComputerInBook3 小时前
泛函分析概观
人工智能·算法·机器学习·泛函分析
Nuanyt3 小时前
LeetCode Hot100 刷题笔记 · 普通数组专题
java·笔记·算法·leetcode