机器人走方格
- 也是一个面试题目,考察的还挺多的。
- 题目大意:M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法。
- 要是有点动态规划的基础,可能会写下一个简单的二维dp。设矩阵dp[i][j]表示的是走到ij这个格子的走法数量,那他应该等于dp[i-1][j]+dp[i][j+1],因为每个机器人就是只能走右或者下。
- 如果这个方法不是很理解,没有动态规划的基础。也ok。
我们把每个方格里都写上步数,看看有没有规律。
1 | 1 | 1 | 1 |
---|---|---|---|
1 | 2 | 3 | 4 |
1 | 3 | 6 | 10 |
1 | 4 | 10 | 20 |
- 如果对杨辉三角有点印象,也能感觉出来了。杨辉三角是怎么求得呢。hhh,如果还没感觉,再看
- 如果把向右走标记为1, 向下走标记为0。按照这个表格,我们可以写下来从左上角走到右下角这样的路线
- 111000/101010/110010/100011等等,可以看出来规律了吧~,就是如果是n行m列,我们想从左上角走到右下角,一定要向右走m次, 向下走n次,其中的顺序可以随便。这就是排列组合中的组合啦。(n+m)个元素了取n个或者m个,就是C。ok啦。
- 原理就这样啦,附上代码以及题目链接,赶紧AC了吧~
const int mod = 1000000000 + 7;
int a[1000 + 10][1000+ 10];
int main()
{
int n, m;
cin>>n>>m;
for(int i = 1; i<= n; i++){
for(int j = 1; j <= m; j++){
if(i == 1||j == 1){
a[i][j] = 1;
continue;
}
a[i][j] = (a[i-1][j] + a[i][j-1])%mod;
}
}
cout<<a[n][m];
return 0;
}
- 面试时候只写了dp的那个。后面的只说了思路,在求解排列组合时候需要借助逆元之类的,没兴趣可以不了解啦~~知道思路更重要些,链接里面用dp简单一些,要是用排列组合,求解逆元之类的麻烦啦~
题目是有提交的地址,机器人走方格
祝你成功~