Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198154
  • 博文数量: 67
  • 博客积分: 2970
  • 博客等级: 少校
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-23 11:36
文章分类

全部博文(67)

文章存档

2012年(2)

2011年(19)

2010年(46)

我的朋友

分类: C/C++

2010-07-25 08:55:07

 

#include<stdio.h>
#include<string.h>

const int dir[][2]={{-1,0},{0,-1},{1,0},{0,1}};
const int Maxn=100;

int g[Maxn][Maxn],num[Maxn][Maxn];
int n,m;

int dp(int x,int y)
{
    if(num[x][y]!=0)        
    {
        return num[x][y];
    }

    for(int move=0;move<4;move++)            
    {
        int newx=x+dir[move][0];
        int newy=y+dir[move][1];
        if(newx<0||newx>=n||newy<0||newy>=m)
            continue;
        if(g[newx][newy]<g[x][y])
        {
            int temp=dp(newx,newy)+1;
            if(temp>num[x][y])
                num[x][y]=temp;
        }
    }

    return num[x][y];  //注明:在一个搜索中的最后一次递归查找只执行了该句返回初始化值0
}

int main()
{
    scanf("%d%d",&n,&m);

    int i,j;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
            scanf("%d",g[i]+j);
        }

    memset(num,0,sizeof(num));

    int max=0;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
            int temp=dp(i,j);
            if(max<temp)
                max=temp;
        }
    printf("%d\n",max+1);
    return 0;
}

 

解题思路:

采用记忆化搜索,即DFS+DP.

阅读(761) | 评论(0) | 转发(0) |
0

上一篇:pku3768 Repeater

下一篇:pku2245 Lotto

给主人留下些什么吧!~~