Number of Paths with Max Score(C++最大得分的路径数目)

 解题思路:

ds表示矩阵每个位置的得分,dp表示每个位置的路径条数

(1)ds[i][j] = max{ds[i+1][j],ds[i][j+1],ds[i+1][j+1]}+board[i][j]-'0',注意board[i][j]不为'X',若为'S','E'可视为'0'

(2)dp[i][j] = {dp[i+1][j],dp[i][j+1],dp[i+1][j+1]}对应的{ds[i+1][j],ds[i][j+1],ds[i+1][j+1]}最大值对应的和。

         例如{ds[i+1][j],ds[i][j+1],ds[i+1][j+1]} = [12,12,3],那么dp[i][j]=dp[i+1][j]+dp[i][j+1],注意每次结果都需要取模10^9 + 7

class Solution {
public:
    vector<int> pathsWithMaxScore(vector<string>& board) {
        int dp[100][100] = {0};
        int ds[100][100] = {0}; // 路径和分数
        int a,b,c; 
        int length = board.size();
        ds[length-1][length-1] = 1;
        dp[length-1][length-1] = 1;
        board[length-1][length-1] = '0';
        board[0][0] = '0';
        for (int i=length-1;i>=0;i--) {
            for (int j=length-1;j>=0;j--) {
                if (board[i][j]!='X') { //等于'X'直接跳过 
                    if (i+1<length) { //判断下方是否越界 
                        if (j+1<length) { //判断右方是否越界 
                            a = ds[i+1][j];
                            b = ds[i][j+1];
                            c = ds[i+1][j+1];

                            if (a>b) { //a>b 
                                if (a>c) {
                                    ds[i][j] = a + (board[i][j]-'0');
                                    dp[i][j] = dp[i+1][j] % 1000000007;
                                } else {
                                    if (a == c) {
                                        ds[i][j] = a + (board[i][j]-'0');
                                        dp[i][j] = (dp[i+1][j]+dp[i+1][j+1]) % 1000000007;
                                    } else {
                                        ds[i][j] = c + (board[i][j]-'0');
                                        dp[i][j] = dp[i+1][j+1] % 1000000007;
                                    }
                                }
                            } else {
                                if (a<b) { // a<b
                                    if (b>c) {
                                        ds[i][j] = b + (board[i][j]-'0');
                                        dp[i][j] = dp[i][j+1] % 1000000007;
                                    } else {
                                        if (b == c) {
                                            ds[i][j] = b + (board[i][j]-'0');
                                            dp[i][j] = (dp[i][j+1]+dp[i+1][j+1]) % 1000000007;
                                        } else {
                                            ds[i][j] = c + (board[i][j]-'0');
                                            dp[i][j] = dp[i+1][j+1] % 1000000007;
                                        }
                                    }		
                                } else { //a == b
                                    if (a>c) {
                                        ds[i][j] = a + (board[i][j]-'0');
                                        dp[i][j] = (dp[i+1][j]+dp[i][j+1]) % 1000000007; 
                                    } else {
                                        if (a == c && a!=0) {
                                            ds[i][j] = a + (board[i][j]-'0');
                                            dp[i][j] = (dp[i+1][j]+dp[i][j+1]+dp[i+1][j+1]) % 1000000007;
                                        } else {
                                            if (a<c) {
                                                ds[i][j] = c + (board[i][j]-'0');
                                                dp[i][j] = dp[i+1][j+1] % 1000000007;	
                                            }  //a==0 a==b==c
                                        }
                                    }

                                }
                            }
                        } else { //只有从下方来 

                            a = ds[i+1][j];

                            if (a!=0) {
                                ds[i][j] = a + (board[i][j]-'0');
                                dp[i][j] = dp[i+1][j] % 1000000007;
                            } 
                        }
                    } else { //只有从右边来 
                        if (j!=length-1) {
                            b = ds[i][j+1];
                            if (b!=0) {
                                ds[i][j] = b + (board[i][j]-'0');
                                dp[i][j] = dp[i][j+1] % 1000000007;
                            } 
                        }
                    }

                }
            }
        } 
        /*
        for (int i=0;i<length;i++) {
            for (int j=0;j<length;j++) {
                cout<<ds[i][j]<<" ";
            }
            cout<<endl;
        }

        for (int i=0;i<length;i++) {
            for (int j=0;j<length;j++) {
                cout<<dp[i][j]<<" ";
            }
            cout<<endl;
        }
        */
        vector<int> v;
        v.push_back(ds[0][0]==0?0:ds[0][0]-1);
        v.push_back(dp[0][0]);
        return v;

    }
};
发布了264 篇原创文章 · 获赞 272 · 访问量 42万+

猜你喜欢

转载自blog.csdn.net/coolsunxu/article/details/105437151