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];
    }
  • 相关阅读:
    SpringMVC 返回 json 字符串中文乱码
    两个HTML页面之间传值
    NOIP2018 保卫王国
    Arch Linux使用cisco anyconnect
    CSP模拟赛 巨神兵
    计蒜客The Fake Fake Friends
    Manjaro安装,配置,美化指南
    [国家集训队] Crash 的文明世界
    ZJOI2011 营救皮卡丘
    CF1198E Rectangle Painting 2
  • 原文地址:https://www.cnblogs.com/Sunqingyi/p/12680425.html
Copyright © 2011-2022 走看看