syhd142  
日历
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678
统计
  • 随笔 - 23
  • 文章 - 122
  • 评论 - 31
  • 引用 - 0

导航

常用链接

留言簿(2)

随笔档案(23)

文章分类(270)

文章档案(122)

我的豆瓣

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 
传说中经典DP,记忆化搜索?其实就是在一个二维数组中求一个最长下降的子序列的长度。
其实就是从每个元素开始找以它为起始点的最长下降子序列,当递归到该点比周围所有的点都小时即返回,
自低向上的方法,注意与广搜不同,广搜是自顶向下。
以后每个点的计算都可以用到以前的结果,因为这是无后效性的?这就是传说中的记忆化?
#include <stdio.h>
#include 
<string.h>

#define N 105
#define INF 1 << 28

int r, c;
int h[N][N], a[N][N];
int dir[4][2= {{01}, {10}, {0-1}, {-10}};

int dfs(int x, int y)
{
    
if(a[x][y]) return a[x][y];
    
int max = 0, t;
    
for(int i = 0; i < 4; i++)
    {
        
int xx = x + dir[i][0];
        
int yy = y + dir[i][1];
        
if(xx < 0 || xx >= r || yy < 0 || yy >= c) continue;
        
if(h[xx][yy] < h[x][y])
        {
            t 
= dfs(xx, yy);
            max 
= max > t ? max : t;
        }
    }
    a[x][y] 
= max + 1;
    
return max + 1;
}

int main()
{
    
int ans;
    
while(~scanf("%d %d"&r, &c))
    {
        
for(int i = 0; i < r; i++)
            
for(int j = 0; j < c; j++)
            {
                scanf(
"%d"&h[i][j]);
                a[i][j] 
= 0;
            }
        ans 
= -INF;
        
for(int i = 0; i < r; i++)
            
for(int j = 0; j < c; j++)
            {
                
int t = dfs(i, j);
                
if(t > ans) ans = t;
            }
        printf(
"%d\n", ans);
    }
    
return 0;
}
posted on 2010-06-08 14:08 Fucker 阅读(189) 评论(0)  编辑 收藏 引用 所属分类: ACM/ICPCDP

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


 
Copyright © Fucker Powered by: 博客园 模板提供:沪江博客