1. 题⽬链接:DP18滑雪
2. 题⽬描述:
3. 解法:
算法思路:
矩阵最⻓递增路径变成矩阵最⻓递减路径~
C++算法代码:
#include <iostream>
#include <vector>
using namespace std;
int key[100][100]; //记忆化数组
int temp[100][100]; //初始矩阵
int n,m;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
//深搜
int dfs(int x,int y)
{
//剪枝
if(key[x][y])
{
return key[x][y];
}
//找到符合条件的位置
int k=1; //找出最长距离
for(int i=0;i<4;i++)
{
int X=x+dx[i],Y=y+dy[i];
if(X>=0&&X<n&&Y>=0&&Y<m&&temp[X][Y]<temp[x][y])
{
k=max(k,dfs(X,Y)+1);
}
}
//返回值
key[x][y]=k;
return key[x][y];
}
int main()
{
//初始化
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>temp[i][j];
}
}
//深搜+记忆化搜索
int ret=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
ret=max(ret,dfs(i,j));
}
}
//输出
cout<<ret;
}
Java算法代码:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main
{
public static int N = 110;
public static int n, m;
public static int[][] arr = new int[N][N];
public static int[][] dp = new int[N][N];
public static int[] dx = { 0, 0, 1, -1 };
public static int[] dy = { 1, -1, 0, 0 };
public static int dfs(int i, int j)
{
if (dp[i][j] != 0) return dp[i][j];
int len = 1;
for (int k = 0; k < 4; k++)
{
int x = i + dx[k], y = j + dy[k];
if (x >= 0 && x < n && y >= 0 && y < m && arr[x][y] < arr[i][j])
{
len = Math.max(len, 1 + dfs(x, y));
}
}
dp[i][j] = len;
return len;
}
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
n = in.nextInt(); m = in.nextInt();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
arr[i][j] = in.nextInt();
}
}
int ret = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
ret = Math.max(ret, dfs(i, j));
}
}
System.out.println(ret);
}
}