• 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 }
  • 相关阅读:
    js复习---工厂函数---构造函数的执行过程
    21年初的措不及防-------
    element ui checkbox实现多项全选反选功能
    vue 实现导航锚点联动
    this.$router.currentRoute 和 this.$route的 区别
    重置vue组件的data数据 this.$options.data()
    父组件中如何拿到引入的子组件里element-ui 的form表单ref对象
    线程笔记
    面向对象
    关于上传和下载的笔记
  • 原文地址:https://www.cnblogs.com/SeekHit/p/5778848.html
Copyright © 2020-2023  润新知