dp 走格子问题

问题:

一个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 }

 

posted @ 2016-08-17 10:12  SeeKHit  阅读(770)  评论(0编辑  收藏  举报