LeetCode 1301. 最大得分的路径数目--动态规划+统计路径方案数

  1. 最大得分的路径数目

给你一个正方形字符数组 board ,你从数组最右下方的字符 ‘S’ 出发。

你的目标是到达数组最左上角的字符 ‘E’ ,数组剩余的部分为数字字符 1, 2, …, 9 或者障碍 ‘X’。在每一步移动中,你可以向上、向左或者左上方移动,可以移动的前提是到达的格子没有障碍。

一条路径的 「得分」 定义为:路径上所有数字的和。

请你返回一个列表,包含两个整数:第一个整数是 「得分」 的最大值,第二个整数是得到最大得分的方案数,请把结果对 10^9 + 7 取余。

如果没有任何路径可以到达终点,请返回 [0, 0] 。

示例 1:

输入:board = [“E23”,“2X2”,“12S”]
输出:[7,1]

示例 2:

输入:board = [“E12”,“1X1”,“21S”]
输出:[4,2]

示例 3:

输入:board = [“E11”,“XXX”,“11S”]
输出:[0,0]

提示:

2 <= board.length == board[i].length <= 100

题解

很裸的一个题目。

AC代码

class Solution {
public:
    int score[105][105];
    long long num[105][105];
    int mod=1000000007;
    vector<int> pathsWithMaxScore(vector<string>& board) 
    {
        memset(score,0,sizeof(score));
        memset(num,0,sizeof(num));
        num[board.size()-1][board.size()-1]=1;
        board[0][0]='0';
        for(int i=board.size()-1;i>=0;i--)
        {
            for(int j=board.size()-1;j>=0;j--)
            {
                if(board[i][j]=='S'||board[i][j]=='X')continue;
                if(score[i][j]<score[i][j+1]+(board[i][j]-'0'))
                {
                    score[i][j]=score[i][j+1]+(board[i][j]-'0');
                    num[i][j]=num[i][j+1];
                }
                else if(score[i][j]==score[i][j+1]+(board[i][j]-'0'))
                {
                    num[i][j]+=num[i][j+1];
                }
                if(score[i][j]<score[i+1][j]+(board[i][j]-'0'))
                {
                    score[i][j]=score[i+1][j]+(board[i][j]-'0');
                    num[i][j]=num[i+1][j];
                }
                else if(score[i][j]==score[i+1][j]+(board[i][j]-'0'))
                {
                    num[i][j]+=num[i+1][j];
                }              

                if(score[i][j]<score[i+1][j+1]+(board[i][j]-'0'))
                {
                    score[i][j]=score[i+1][j+1]+(board[i][j]-'0');
                    num[i][j]=num[i+1][j+1];
                }
                else if(score[i][j]==score[i+1][j+1]+(board[i][j]-'0'))
                {
                    num[i][j]+=num[i+1][j+1];
                }        
                num[i][j]%=mod;                    
            }
        }
        vector<int>res;
        if(num[0][0]==0)
        res.push_back(0);
        else
        res.push_back(score[0][0]);
        res.push_back(num[0][0]);
        return res;
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值