当前位置:   article > 正文

DFS:记忆化搜索

DFS:记忆化搜索

​​​​​​​

一、记忆化搜索vs动态规划

. - 力扣(LeetCode)

  1. class Solution {
  2. public:
  3. //记忆化搜索
  4. //1、设置一个备忘录,要确保备忘录初始化的结果不能跟我们实际计算的结果相同
  5. //2、添加备忘录,计算的时候,如果备忘录的位置是初始值,进行修改
  6. //3、每次计算的时候,去备忘录瞅一瞅,找到的话,就可以不算了
  7. int memory[31];
  8. int fib(int n)
  9. {
  10. memset(memory,-1,sizeof(memory));//利用memset进行初始化成-1
  11. return dfs(n);
  12. }
  13. int dfs(int n)
  14. {
  15. //递归进入前,去备忘录瞅瞅
  16. if(memory[n]!=-1) return memory[n];
  17. if(n==0||n==1)
  18. {
  19. memory[n]=n;
  20. return memory[n];
  21. }
  22. else
  23. {
  24. memory[n]=dfs(n-1)+dfs(n-2);
  25. return memory[n];
  26. }
  27. }
  28. };

二、不同路径

  1. class Solution {
  2. public:
  3. int uniquePaths(int m, int n)
  4. {
  5. //记忆化搜索
  6. vector<vector<int>> memo(m+1,vector<int>(n+1,-1));//建立一个记忆数组
  7. return dfs(m,n,memo);//dfs去帮我搜索
  8. }
  9. int dfs(int i,int j,vector<vector<int>>&memo)
  10. {
  11. if(memo[i][j]!=-1) return memo[i][j];
  12. if(i==0||j==0) return 0;
  13. if(i==1&&j==1) return 1;
  14. memo[i][j]=dfs(i-1,j,memo)+dfs(i,j-1,memo);
  15. return memo[i][j];
  16. }
  17. };

三、最长的递增子序列

  1. class Solution {
  2. public:
  3. //记忆化搜索
  4. //不用记忆化搜索的话会超时,因为本身就是一个多叉树
  5. int lengthOfLIS(vector<int>& nums)
  6. {
  7. vector<int> memo(nums.size()+1,-1);
  8. int ret=1;
  9. for(int i=0;i<nums.size();++i)
  10. {
  11. ret=max(dfs(nums,i,memo),ret);
  12. }
  13. return ret;
  14. }
  15. int dfs(vector<int>& nums,int pos,vector<int>&memo)//从pos位置开始,以pos位置做起点,往后搜索出他的最长子序列
  16. {
  17. //接下去开始从下一个位置开始找
  18. if(memo[pos]!=-1) return memo[pos];
  19. int ret=1;
  20. for(int i=pos+1;i<nums.size();++i)
  21. {
  22. if(nums[i]>nums[pos]) //找到了,就更新ret,然后去以下一个位置为起点接着找
  23. {
  24. ret=max(ret,dfs(nums,i,memo)+1);
  25. }
  26. }
  27. memo[pos]=ret;
  28. return memo[pos];
  29. }
  30. };

四、猜数字大小II

  1. class Solution {
  2. public:
  3. int getMoneyAmount(int n)
  4. {
  5. vector<vector<int>> memo(n+1,vector<int>(n+1));
  6. return dfs(1,n,memo);
  7. }
  8. int dfs(int left,int right, vector<vector<int>>&memo)
  9. {
  10. if(left>=right) return 0;
  11. if(memo[left][right]) return memo[left][right];//去备忘录瞅瞅
  12. int ret=INT_MAX;
  13. for(int i=left;i<=right;++i)
  14. {
  15. int l=dfs(left,i-1,memo);//左边的最小
  16. int r=dfs(i+1,right,memo);//右边的最小
  17. ret=min(ret,max(l,r)+i);
  18. }
  19. memo[left][right]=ret;
  20. return memo[left][right];
  21. }
  22. };

五、矩阵的最长递增路径

  1. class Solution {
  2. public:
  3. int dx[4]={0,0,1,-1};
  4. int dy[4]={1,-1,0,0};
  5. int m,n;
  6. //记忆化搜索,不然会超时
  7. int longestIncreasingPath(vector<vector<int>>& matrix)
  8. {
  9. int ret=1;
  10. m=matrix.size(),n=matrix[0].size();
  11. vector<vector<int>> memo(m+1,vector<int>(n+1));
  12. for(int i=0;i<m;++i)
  13. for(int j=0;j<n;++j)
  14. {
  15. ret=max(ret,dfs(matrix,i,j,memo));//以任意坐标为起点,dfs去帮我们找到最大的路径
  16. }
  17. return ret;
  18. }
  19. int dfs(vector<vector<int>>& matrix,int i,int j, vector<vector<int>>&memo)
  20. {
  21. if(memo[i][j]!=0) return memo[i][j];
  22. int ret=1;
  23. for(int k=0;k<4;++k)
  24. {
  25. int x=i+dx[k],y=j+dy[k];
  26. if(x>=0&&x<m&&y>=0&&y<n&&matrix[x][y]>matrix[i][j])
  27. ret=max(dfs(matrix,x,y,memo)+1,ret);
  28. }
  29. memo[i][j]=ret;//填备忘录
  30. return memo[i][j];
  31. }
  32. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/423458
推荐阅读
相关标签
  

闽ICP备14008679号