题目:https://vjudge.net/problem/UVA-10285
思路:简单的DP题
dp(r, c)表示以r行c列的点为起点的最长距离,上下左右如果能走就是下一个状态+1,没有一个方向能走边界条件就是1,取最大值。
把这道题当作了一个JAVA练手题,不要在意这别扭的代码
代码:JAVA
import java.util.Scanner;
public class Main {
public static int R, C;
public static int[][] pic;
public static int[][] d;
public static int[] movex, movey;
public static void main(String[] args) {
// TODO 自动生成的方法存根
pic = new int[110][110];
d = new int[110][110];
movex = new int[] {1, -1, 0, 0};
movey = new int[] {0, 0, 1, -1};
int T;
Scanner cin = new Scanner(System.in);
T = cin.nextInt();
for(int cases = 0; cases < T; cases++)
{
String name = cin.next();
R = cin.nextInt();
C = cin.nextInt();
for(int i = 0; i < R; i++)
{
for(int j = 0; j < C; j++)
{
pic[i][j] = cin.nextInt();
}
}
init();
int ans = 1;
for(int i = 0; i < R; i++)
{
for(int j = 0; j < C; j++)
{
ans = Math.max(ans, dp(i, j));
}
}
System.out.println(name + ": " + ans);
}
cin.close();
}
public static void init()
{
for(int i = 0; i < R; i++)
{
for(int j = 0; j < C; j++)
{
d[i][j] = 0;
}
}
}
public static int dp(int r, int c)
{
if(d[r][c] != 0)
{
return d[r][c];
}
d[r][c] = 1;
for(int i = 0; i < 4; i++)
{
if(r + movex[i] >=0 && r + movex[i] < R && c + movey[i] >= 0 && c + movey[i] < C)
{
if(pic[r + movex[i]][c + movey[i]] < pic[r][c])
{
d[r][c] = Math.max(d[r][c], 1 + dp(r + movex[i], c + movey[i]));
}
}
}
return d[r][c];
}
}