zoukankan      html  css  js  c++  java
  • POJ 1088 滑雪 记忆化优化题解

    本题有人写是DP,只是和DP还是有点区别的,应该主要是记忆化 Momoization 算法。

    思路就是递归,然后在递归的过程把计算的结果记录起来,以便后面使用。

    非常经典的搜索题目,这样的方法非常多题目考到的。

    关键还是怎样把代码写清晰工整了,O(∩_∩)O~。

    #include <stdio.h>
    const int MAX_N = 101;
    int R, C;
    int arr[MAX_N][MAX_N];
    int tbl[MAX_N][MAX_N];
    
    inline int max(int a, int b) { return a > b ? a : b ; }
    
    inline bool isLegal(int r, int c, int r1, int c1)
    {
    	return 0<=r1 && 0<=c1 && r1<R && c1<C && arr[r][c] < arr[r1][c1];
    }
    
    int getMaxStair(int r, int c)
    {
    	if (tbl[r][c]) return tbl[r][c];
    
    	int up = isLegal(r, c, r+1, c)? getMaxStair(r+1, c) : 0;
    	int down = isLegal(r, c, r-1, c)? getMaxStair(r-1, c) : 0;
    	int left = isLegal(r, c, r, c-1)? getMaxStair(r, c-1) : 0;
    	int right = isLegal(r, c, r, c+1)? getMaxStair(r, c+1) : 0;
    	
    	return tbl[r][c] = max(max(up, down), max(left, right)) + 1;
    }
    
    int getMaxStairNum()
    {
    	int ans = 0;
    
    	for (int i = 0; i < R; i++)
    	{
    		for (int j = 0; j < C; j++)
    		{
    			getMaxStair(i, j);
    		}
    	}
    
    	for (int i = 0; i < R; i++)
    	{
    		for (int j = 0; j < C; j++)
    		{
    			ans = max(ans, tbl[i][j]);
    		}
    	}
    	return ans;
    }
    
    int main()
    {
    	while (scanf("%d %d", &R, &C) != EOF)
    	{
    		for (int i = 0; i < R; i++)
    		{
    			for (int j = 0; j < C; j++)
    			{
    				scanf("%d", &arr[i][j]);
    				tbl[i][j] = 0;
    			}
    		}
    		printf("%d
    ", getMaxStairNum());
    	}
    	return 0;
    }



  • 相关阅读:
    LINUX-----管道流及重定向
    转:vim----复制粘贴
    linux ----虚拟机无法与本地机通信
    C语言---注释
    C语言---翻译过程
    DROP--删除表
    ALTER---删除字段
    Oracle中用一条Sql实现任意的行转列拼接 多行拼接
    Oracle列操作(增加列,修改列,删除列)
    Java 把long 转换成 日期 再转换成String类型
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4253197.html
Copyright © 2011-2022 走看看