题目考察的知识点:动态规划

题目解答方法的文字分析:从起点到必经点的路径,再从必经点到终点的路径;创建一个dp表,然后初始化,找到2的位置,在2的位置继续初始化,然后再寻找路径,到终点即可。

本题解析所用的编程语言:c++

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param cows int整型vector<vector<>> 
     * @return int整型
     */
    int uniquePathsWithCows(vector<vector<int> >& cows) {
        // write code here
    int m = cows.size(), n = cows[0].size();
    vector<vector<int>> dp(m + 1, vector<int>(n + 1));
	//第一次初始化
    dp[0][1] = 1;
    int i = 0, j = 0;
    for (i = 1; i <= m; ++i)
    {
        for (j = 1; j <= n; ++j)
        {
            if (cows[i - 1][j - 1] == 2)
                break;
            if (cows[i - 1][j - 1] != 1)
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
        }
        if (j <= n && cows[i - 1][j - 1] == 2)
            break;
    }
	  //第二次初始化
    int tmp = dp[i - 1][j];
    for (int k = j - 1; k <= n; ++k)
            dp[i - 1][k] = 0;

    dp[i - 1][j] = tmp;
    for (int a = i; a <= m; ++a)
    {
        for (int b = j; b <= n; ++b)
        {
            if (cows[a - 1][b - 1] != 1)
                dp[a][b] = dp[a - 1][b] + dp[a][b - 1];
        }
    }
    return dp[m][n];
    }
};