问题
给定二维数组,从左上走到右下的走法种树,数组中1代表该格可以走,0代表不能走。且只能向下和向右走。
解法
典型的动态规划问题:
dp[i][j]表示从[0][0]到[i][j]的走法数量。
状态转移方程:
dp[0][j] = 1 where i = 0
dp[i][0] = 1 where j = 0
dp[i][j] = dp[i-1][j] + dp[i][j-1] where arr[i][j] == 1
dp[i][j] = 0 where arr[i][j] == 0
代码实现
int arr_path_nums(vector<vector<int> > arr,int M,int N)
{
int i,j;
vector<vector<int> > dp(M,vector<int>(N,0));
//初始条件
for (i=0;i<M;i++)
dp[i][0] = 1;
for (j=0;j<N;j++)
dp[0][j] = 1;
for (i =1;i<M;i++)
{
for (j=1;j<N;j++)
{
if (arr[i][j] == 1)
{
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
else if (arr[i][j] == 0)
{
dp[i][j] = 0;
}
else
return -1;
}
}
return dp[M-1][N-1];
}
优化
本题依然可以用动态规划典型的空间优化方法,因为dp[i][j]是依赖左边和上边的值的,所以可以申请一个大小为N的数组,每次从后到前遍历即可。代码就不用给出了,很简单。