zoukankan      html  css  js  c++  java
  • DP动态规划

    动态规划和分治没有根本上的区别(关键看有无最优子结构)

    共性:找到重复子结构

    差异性:最优子结构,中途可以淘汰次优解

    问题一:斐波那契数列

    int fib(int n)
    {
       if(n<=1) return n;
       else 
          return fib(n-1)+fib(n-2);
    }

    可以利用记忆数组进行优化

    int fib(int n,int memo[])
    {
       if(n<=1) return n;
       else if(memo[n]==0)
           return fib(n-1)+fib(n-2);
       return memo[n];
    }

    这样就把指数级的时间复杂度降到了O(n)

    问题2 count the paths

    计算从start到end共有多少条路径

    方法一:自顶向下

    采用分治的思想

    path[start] = path[A]+paths[B]

    int countPaths(bool[][] grid,int row,int col)
    {
        if(!isWall())  return 0;
        if(isEnd())  return 1;
        return countPaths(grid,row+1,col)+countPaths(grid,row,col+1);    
    }

    方法二 自底向上

    只能向下或向右,那么到达最下方和最右方时只有1种走法。那么paths[i][j]=paths[i+1][j]+paths[i][j+1],以此类推可以得到开始先走A和开始先走B分别是10种和17种,所以一共有27种。

    int countPaths(int m,int n)
    {
       int grid[m][n];
       for(int i=0;i<n;i++) grid[i][0]=1;
       for(int j=0;j<;j++) grid[0][j]=1;
       for(int i=1;i<m;i++){
         for(int j=1;j<n;j++)
            grid[i][j]=grid[i-1][j]+grid[i][j-1];
       }
        return grid[m-1][n-1];
    }
  • 相关阅读:
    coding
    我的大学
    《活出生命的意义》读后感
    《世界是数字的》读后感
    学习进度表
    阅读《我是一只IT小小鸟有感》
    《软件工程师职业规范》心得
    软件工程第二次结对作业
    软件工程第三次作业
    软件工程第二次作业
  • 原文地址:https://www.cnblogs.com/Sunqingyi/p/12680425.html
Copyright © 2011-2022 走看看