当前位置:   article > 正文

动态规划——记忆化搜索DP

动态规划——记忆化搜索DP

901. 滑雪 - AcWing题库为例

记忆化搜索和DFS:
DFS:在某个方向上滑雪滑倒不能滑为止,然后再回溯继续滑,直到以所有点为起始点全部遍历完
记忆化搜索:用f[i,j]记录,以某点开始滑的最大路径,保证不重复搜索

f[][]二维数组初始化的时候最好统一赋值为-1,如果不进行初始化直接用0判断,此题可以,可是如果遇到一些记忆化搜索的问题要求方案数的时候,初始化是0可能会导致个别情况计算出来的恰好结果是0时,却被认为未遍历过,因此统一赋值为-1就没错了

python版本:

  1. N = 310
  2. high = [[0] * N for _ in range(N)]
  3. f = [[-1] * N for _ in range(N)]
  4. dx = [-1,0,1,0]
  5. dy = [0,1,0,-1]
  6. n,m=map(int,input().split())
  7. for i in range(1,n+1):
  8. ll=list(map(int,input().split()))
  9. high[i][1:m+1]=ll
  10. def dp(x,y):
  11. if f[x][y]!=-1:
  12. return f[x][y]
  13. f[x][y]=1
  14. for i in range(4):
  15. a=x+dx[i]
  16. b=y+dy[i]
  17. if 1<=a<=n and 1<=b<=m and high[x][y]>high[a][b]:
  18. f[x][y]=max(f[x][y],dp(a,b)+1)
  19. return f[x][y]
  20. def DP():
  21. res = 0
  22. for i in range(1,n+1):
  23. for j in range(1,m+1):
  24. res = max(res,dp(i,j))
  25. return res
  26. print(DP())

c++版本:

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. using namespace std;
  5. const int N = 310;
  6. int f[N][N], w[N][N];
  7. int n, m;
  8. int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
  9. int dp(int x, int y)
  10. {
  11. int &t = f[x][y];
  12. if (t != -1) return t;
  13. t = 1;
  14. for(int i = 0; i < 4; i ++)
  15. {
  16. int a = dx[i] + x, b = dy[i] + y;
  17. if (a >= 1 && a <= n && b >= 1 && b <= m && w[a][b] < w[x][y]) {
  18. t = max(t, dp(a, b) + 1);
  19. }
  20. }
  21. return t;
  22. }
  23. int main(){
  24. scanf("%d%d", &n, &m);
  25. for(int i = 1; i <= n; i ++)
  26. for(int j = 1; j <= m; j ++)
  27. scanf("%d", &w[i][j]);
  28. memset(f, -1, sizeof f);
  29. int res = 0;
  30. for(int i = 1; i <= n; i ++)
  31. for(int j = 1; j <= m; j ++)
  32. res = max(res, dp(i, j));
  33. cout << res << endl;
  34. return 0;
  35. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/1003379
推荐阅读
相关标签
  

闽ICP备14008679号