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];
}

 

posted @ 2020-04-11 15:50  不二良  阅读(143)  评论(0编辑  收藏  举报