DFS+DP

某妹子说这叫记忆化搜索

简述:就是从矩阵内部某一点由大到小找一条最长通路

        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

       一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-…-3-2-1更长。事实上,这是最长的一条。


Input

输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。

Output

输出最长区域的长度。

Sample Input

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

25

#include<cstdio>
const int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int r,c;
int node[101][101];
int opt[101][101];

bool ok(int i,int j)
{
	return (i>=1 && i<=r && j>=1 && j<=c);
}

int dp(int i,int j)
{
	int k;
	if(opt[i][j]>0) return opt[i][j];
	for(k=0;k<4;k++)
	{
		if(ok(i+dx[k],j+dy[k])) 
			if(node[i+dx[k]][j+dy[k]]<node[i][j])
			{
				if(opt[i][j]<dp(i+dx[k],j+dy[k])+1)
					opt[i][j]=dp(i+dx[k],j+dy[k])+1;
					
			}
	}
	return opt[i][j];
}
int main()
{
	int max=0,i,j;
	scanf("%d %d",&r,&c);
	
	for(i=1;i<=r;i++)
		for(j=1;j<=c;j++)
			scanf("%d",&node[i][j]),opt[i][j]=0;
	
	for(i=1;i<=r;i++)
		for(j=1;j<=c;j++)
			if(max<dp(i,j)) max=dp(i,j);
	printf("%d",max+1);
    return 0;
}
    原文作者:DFS
    原文地址: https://blog.csdn.net/stodgers/article/details/23041177
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞