问题:
一个5x8的格子,想从左下角走到右上角,求最短路径,共有多少种走法。
思路:
因为是求最短路径,所以,只会往右往上走。
我们可以把棋盘的左下角看做二维坐标的原点(0,0),把棋盘的右上角看做二维坐标(M,N)(坐标系的单位长度为小方格的变长)
用f(i,j)表示移动到坐标f(i,j)的走法总数,其中0=<i,j<=n,设f(m,n)代表从坐标(0,0)到坐标(m,n)的移动方法,则
f(m,n)=f(m-1,n)+f(m,n-1).
于是状态f(i,j)的状态转移方程为:
f(i,j)=f(i-1,j)+f(i,j-1) if i,j>0
f(i,j)=f(i,j-1) if i=0
f(i,j)=f(i-1,j) if j=0
初始情况就为:f(0,0)=0, f(0,1)=1, f(1,0)=1,这个问题可以在时间O(n^2),空间O(n^2)内求解。
代码:
给出递归和非递归的2种方法
1 #include"iostream" 2 #include"algorithm" 3 #define MAX 10000 4 using namespace std; 5 6 int f[MAX][MAX]; 7 8 int processNew(int m, int n) 9 { 10 f[0][0] = 0; 11 for (int j = 1; j <= n; ++j) 12 f[0][j] = 1; 13 for (int i = 1; i <= m; ++i) 14 f[i][0] = 1; 15 //迭代计算 16 for (int i = 1; i <= m; ++i) 17 { 18 for (int j = 1; j <= n; ++j) 19 { 20 f[i][j] = f[i - 1][j] + f[i][j - 1]; 21 } 22 } 23 int res = f[m][n]; 24 return res; 25 } 26 27 int solve(int m,int n) 28 { 29 if (m == 0 & n == 0) 30 return 0; 31 if (m == 0 || n == 0) 32 return 1; 33 34 return solve(m - 1, n) + solve(m, n - 1); 35 } 36 37 int main() 38 { 39 int m, n; 40 cin >> m >> n; 41 cout<<solve(m, n)<<endl; 42 cout << processNew(m, n); 43 system("pause"); 44 }