UVA-10285

   日期:2020-09-06     浏览:122    评论:0    
核心提示:题意: 给一个R*C大小的int型矩阵,起点终点任意,每次只能朝一个方向(上下左右均可,不能斜着走)走一步,且只能从更大的数走向更小的数,求最长路径。题解: 记忆化DP。DP[i][j]表示从(i,j)出发所能走的最长路径,则状态转移方程可描述如下:对于上下左右4个方向,如果走得通的话,则选择能走的最远的一个方向走。#include #include #include ...

题意:

        给一个R*C大小的int型矩阵,起点终点任意,每次只能朝一个方向(上下左右均可,不能斜着走)走一步,且只能从更大的数走向更小的数,求最长路径。

题解:

       记忆化DP。DP[i][j]表示从(i,j)出发所能走的最长路径,则状态转移方程可描述如下:对于上下左右4个方向,如果走得通的话,则选择能走的最远的一个方向走。

#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
int a[100][100], DP[100][100], R, C; string name;
int dp(int i, int j)
{
	if (DP[i][j]>0) return DP[i][j];
	int llr = 1;     //左右上下分别试探
	if (i - 1 >= 0 && a[i][j] > a[i - 1][j])llr = max(llr,  1 + dp(i - 1, j));
	if (i + 1 < R  && a[i][j] > a[i + 1][j])llr = max(llr, 1 + dp(i + 1, j));
	if (j - 1 >= 0 && a[i][j] > a[i][j - 1])llr = max(llr, 1 + dp(i, j - 1));
	if (j + 1 < C  && a[i][j] > a[i][j + 1])llr = max(llr, 1 + dp(i, j + 1));
	return DP[i][j] = llr;
}
int main()
{
	int N, lr;  cin >> N;
	while (N--)
	{
		cin >> name >> R >> C;   memset(DP, 0, sizeof(DP));  lr = 0;
		for (int i = 0; i < R; i++) for (int j = 0; j < C; j++) cin >> a[i][j];
		for (int i = 0; i < R; i++) for (int j = 0; j < C; j++) lr = max(lr, dp(i, j));
		cout << name << ": " << lr << endl;
	}
	return 0;
}

 

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服