1. 程式人生 > >uva 10285 記憶化搜尋

uva 10285 記憶化搜尋

求矩陣中最長遞減路徑的長度,記憶化搜尋,因為要找的路徑是嚴格遞減的,所以不會有回頭路

Sample Input
2
Feldberg 10 5
56 14 51 58 88
26 94 24 39 41
24 16 8 51 51
76 72 77 43 10
38 50 59 84 81
5 23 37 71 77
96 10 93 53 82
94 15 96 69 9
74 0 62 38 96
37 54 55 82 38
Spiral 5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
 
Sample Output
Feldberg: 7
Spiral: 25

#include<stdio.h>
#include<string.h>
#define N 110
char b[N];
int n,m,a[N][N],f[N][N],max;
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};//иообвСср
int dfs(int x,int y)
{
    int i,j,tx,ty,tmp,ans;
    if(f[x][y]!=-1)
        return f[x][y];
    ans=1;
    for(i=0;i<4;i++)
    {
        tx=x+dx[i];
        ty=y+dy[i];
        if(tx>=0&&tx<n&&ty>=0&&ty<m&&a[tx][ty]<a[x][y])
        {
            tmp=dfs(tx,ty);
            if(tmp+1>ans)
                ans=tmp+1;
        }
    }
    return f[x][y]=ans;
}
int main()
{
    int i,j,tmp,l;
    scanf("%d",&l);
    while(l--)
    {
        scanf("%s%d%d",b,&n,&m);
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
                scanf("%d",&a[i][j]);
        }
        memset(f,-1,sizeof(f));
        max=1;
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                tmp=dfs(i,j);
                if(tmp>max)
                    max=tmp;
            }
        }
        printf("%s: %d\n",b,max);
    }
    return 0;
}