uva 10285 記憶化搜尋
阿新 • • 發佈:2019-02-13
求矩陣中最長遞減路徑的長度,記憶化搜尋,因為要找的路徑是嚴格遞減的,所以不會有回頭路
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; }