在NxM的方格中,以左上角格子为起点,右下角格子为终点,每次只能向下走或者向右走,请问一共有多少种不同的走法给定两个正整数int n,int m,请返回走法数目。
传统做法:dp[n][m]= dp[n-1][m] + dp[n][m-1] (n>1,m>1)
组合做法:一共要走(n-1)+(m-1)次其中有(n-1)次要选择向下走,当选者好向下走的位置后向右走的位置也随之确定,即dp[n][m] = C(n+m-2, n-1),同理有(m-1)次选择向右走即dp[n][m] dp[n][m] = C(n+m-2, n-1)
故:dp[n][m] = C(n+m-2, n-1) = C(n+m-2, m-1)
一些证明方法:
抽象出杨辉三角
同理可证m=k+1
打印路径:(代码来自网络)
#include <stdio.h>
typedef struct temp
{
int x;
int y;
int parent;
}Queue;
void path(int m, int n)
{
Queue q[1000];
int front = 0, rear = 0, i;
q[rear].x = 0;
q[rear].y = 0;
q[rear++].parent = -1;
while (front != rear)
{
if (q[front].x == m-1 && q[front].y == n-1)
{
i = front;
while (i != -1)
{
printf("%3d <-", q[i].x*n + q[i].y+1);
i = q[i].parent;
}
printf("\n");
}
if (q[front].y < n-1)
{
q[rear].x = q[front].x;
q[rear].y = q[front].y+1;
q[rear++].parent = front;
}
if (q[front].x < m-1)
{
q[rear].x = q[front].x+1;
q[rear].y = q[front].y;
q[rear++].parent = front;
}
front++;
}
}
int main()
{
path(6,5);
return 0;
}