题目
总时间限制: 1000ms 内存限制: 65536kB
描述
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
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更长。事实上,这是最长的一条。
输入
输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
输出
输出最长区域的长度。
样例输入
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
样例输出
25
思路1
动态规划。
L(i,j)
表示从点
(i,j)
出发的最长滑行长度,如果
(i,j)
周围没有比它低的点,则
L(i,j)=1
;否则
L(i,j)
等于从
(i,j)
周围四个点中高度比
(i,j)
低且L值最大的那个点P的值加上1。
人人为我。用周围的状态,来更新当前状态。
代码1
while True:
try:
ROW, COL = input().split()
ROW = int(ROW); COL = int(COL)
points = []
fields = [[0 for i in range(COL + 2)] for _ in range(ROW + 2)]
dp = [[0 for i in range(COL + 2)] for _ in range(ROW + 2)]
for i in range(1, ROW + 1):
nums = input().split()
nums = [int(j) for j in nums]
for j in range(1, COL + 1):
points.append((i, j, nums[j - 1]))
fields[i][j] = nums[j - 1]
dp[i][j] = 1
points.sort(key=lambda x : x[2])
for point in points:
row = point[0];col = point[1];val = point[2]
if fields[row][col] > fields[row - 1][col]:
dp[row][col] = max(dp[row][col], dp[row - 1][col] + 1)
if fields[row][col] > fields[row + 1][col]:
dp[row][col] = max(dp[row][col], dp[row + 1][col] + 1)
if fields[row][col] > fields[row][col - 1]:
dp[row][col] = max(dp[row][col], dp[row][col - 1] + 1)
if fields[row][col] > fields[row][col + 1]:
dp[row][col] = max(dp[row][col], dp[row][col + 1] + 1)
maxnum = 0
for tmp in dp:
maxnum = max(max(tmp), maxnum)
print(maxnum)
except:
break
思路2
我为人人。用自身已经确定的状态,更新四周的状态。
代码2
while True:
try:
ROW, COL = input().split()
ROW = int(ROW); COL = int(COL)
points = []
fields = [[0 for i in range(COL + 2)] for _ in range(ROW + 2)]
dp = [[0 for i in range(COL + 2)] for _ in range(ROW + 2)]
for i in range(1, ROW + 1):
nums = input().split()
nums = [int(j) for j in nums]
for j in range(1, COL + 1):
points.append((i, j, nums[j - 1]))
fields[i][j] = nums[j - 1]
dp[i][j] = 1
points.sort(key=lambda x : x[2])
for point in points:
row = point[0];col = point[1];val = point[2]
if fields[row][col] < fields[row - 1][col]:
dp[row - 1][col] = max(dp[row][col] + 1, dp[row - 1][col])
if fields[row][col] < fields[row + 1][col]:
dp[row + 1][col] = max(dp[row][col] + 1, dp[row + 1][col])
if fields[row][col] < fields[row][col - 1]:
dp[row][col - 1] = max(dp[row][col] + 1, dp[row][col - 1])
if fields[row][col] < fields[row][col + 1]:
dp[row][col + 1] = max(dp[row][col] + 1, dp[row][col + 1])
maxnum = 0
for tmp in dp:
maxnum = max(max(tmp), maxnum)
print(maxnum)
except:
break