题目:
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).
How many possible unique paths are there?
Above is a 3 x 7 grid. How many possible unique paths are there?
Note: m and n will be at most 100.
思路:典型的DP问题,可以在矩阵中计算所能走的方法,二维矩阵的大小比步数大
#include <iostream>
#include <vector>
using namespace std;
int UniquePath(int m,int n)
{
int i,j;
vector<vector<int> > path;
for(i=0;i<m;i++)
{
vector<int> vec(n,0);
path.push_back(vec);
}
for(i=0;i<m;i++)
path[i][0] = 1;
for(i=0;i<n;i++)
path[0][i] = 1;
for(i=1;i<m;i++)
for(j=1;j<path[0].size();j++)
path[i][j] = path[i-1][j] +path[i][j-1];
return path[m-1][n-1];
}
int main()
{
cout<<UniquePath(3,4)<<endl;
return 0;
}
其实这也是一个组合数的求解问题,m+n-2个数总取出n-1,使用求组合数的公式
int UniquePath(int m,int n)
{
int small = m< n? m-1;n-1;
int big = m< n? n-1:m-1;
unsigned int dedom =1;
unsigned int dom =1;
for(int i=1;i<=small;i++)
{
dom *=i;
dedom *= small+big+1-i;
}
return dedom/dom;
}