题意:给定一个n*m的地图,0到10000的数字,寻找到一条最长的路径,该路径严格递减,延伸方式只能上下左右。
思路:遍历每个点,然后进行深搜,因为路径可能会重复搜索,所以用dp来保存,当dp[x][y]>0时候,代表这个点不用延伸了,之前已经做过了,直接返回dp[x][y]就行了。
#include<stdio.h>
#include <string.h>
int a[105][105],dp[105][105];
int max(int a,int b)
{
return a>b?a:b;
}
int dfs(int x,int y,int p)
{
if(a[x][y]==-1)//如果越界
return 0;
if(dp[x][y]>0)//如果该点之后的路径已经搜过了
return dp[x][y];
dp[x][y]=1;//代表该点之前没访问过,现在访问,一开始这句没加就WA了,没有这句该点有可能重复搜到。
if(p>a[x+1][y])
dp[x][y]=max(dp[x][y],dfs(x+1,y,a[x+1][y])+1);
if(p>a[x][y+1])
dp[x][y]=max(dp[x][y],dfs(x,y+1,a[x][y+1])+1);
if(p>a[x-1][y])
dp[x][y]=max(dp[x][y],dfs(x-1,y,a[x-1][y])+1);
if(p>a[x][y-1])
dp[x][y]=max(dp[x][y],dfs(x,y-1,a[x][y-1])+1);
return dp[x][y];
}
int main()
{
int r,c;
in