leetcodeライブラリ--63別経路II
int fun(int num)
{
int ans = 1;
while(num)
{
ans*=num;
num--;
}
return ans;
}
int uniquePaths(int m, int n) {
int all = m+n-2;
int ans = fun(all)/fun(m-1)/fun(all-m+1);
return ans;
}
63異なる経路IIのロボットは、m x nグリッドの左上に位置しています.(スタートポイントは下図の「Start」と表記されています.)ロボットは下か右にしか動かない.ロボットはグリッドの右下に到達しようとします.
グリッド内に障害物があると考えます.左上から右下まではいくつのルートがありますか?
考え:この問題は典型的な動的計画問題で、dp[i+1][j+1]で第i行j列に到達するにはいくつかの走法があると表しています.状態移動方程式も書きやすいです.各格の位置に到達するには二つの方法しかありません.上から下へ、または左から右へ.dp[i+1][j+1]=dp[i]、[j+1]+dp[i+1][j]開始にはdp[0][1]=1が必要です.最初の席に行くには歩き方があるからです.
ここでは、すべての結果を保存するための配列を使用していますが、実際には、各位置は前の行とこの行の新しい情報だけを見ることができます.したがって、一次元配列だけでいいです.
似たテーマ:階段を歩く(一次元の)
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
vector> dp(m+1, vector(n+1, 0));
dp[0][1] = 1;
for(int i = 0; i < m; ++i)
{
for(int j = 0; j < n; ++j)
{
if(obstacleGrid[i][j] == 0)
{
dp[i+1][j+1] = dp[i][j+1] + dp[i+1][j];
}
}
}
return dp[m][n];
)