Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 38510 Accepted: 13594

本题是简单的DP问题,一开始的时候我用的是深搜的方法,但是发现很容易超时,所以用DP只用了0ms

   思路:对每一个点进行搜索,然后用一个数组来保存每个点搜索到得最佳结果,当下一次搜索时如果此数组并非初始值就可直接调用。最后求出最大的那一个便是我们想要的结果

代码:

 

1 #include<stdio.h>
2 #include<string.h>
3  int b[4][2]={{1,0},{-1,0},{0,1},{0,-1}};int a[105][105],r,c;int d[105][105];
4  int test(int x,int y)
5 {
6 int i,s;
7 int count=0;
8 if(d[y][x]>0)
9 return d[y][x];
10 for(i=0;i<=3;i++)
11 if(a[y+b[i][1]][x+b[i][0]]<a[y][x] && (x+b[i][0])>=1 && (x+b[i][0])<=c && (y+b[i][1])>=1 && (y+b[i][1])<=r)
12 {
13 s=test(x+b[i][0],y+b[i][1]);
14 if(s>count)
15 count=s;
16 }
17 d[y][x]=count+1;
18 return count+1;
19
20
21 }
22  int main()
23 {
24 int i,j,max,s;
25 scanf("%d%d",&r,&c);
26 memset(d,0,sizeof(d[0]));
27 max=0;
28 for(i=1;i<=r;i++)
29 for(j=1;j<=c;j++)
30 {
31 scanf("%d",&a[i][j]);
32 }
33 for(i=1;i<=r;i++)
34 for(j=1;j<=c;j++)
35 {
36
37 s=test(j,i);
38 if(s>max)
39 {
40 max=s;
41 }
42 }
43 printf("%d\n",max);
44
45 return 0;
46 }
47