skiing

来源:互联网 发布:mac安装哪些常用软件 编辑:程序博客网 时间:2024/04/28 23:36
描述
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。
后面是下一组数据;
输出
输出最长区域的长度。
样例输入
15 51 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9
样例输出
25


此题用动态规划

max(dfs(x,y-1,n,n,map[xy]),dfs(x-1,y,n,n,map[xy]),dfs(x+1,y,n,n,map[xy]),dfs(x,y+1,n,n,map[xy])

#include<stdio.h>#include<memory.h>int R, C;int map[101][101];//各点高度int record[101][101];//各点最大滑雪长度inline int max(int a, int b) {//inline表示编译时直接嵌入至调用处,节省调用函数的时间return a > b ? a : b;}inline int max(int a, int b, int c, int d) {return max(max(a, b), max(c, d));}int dfs(int row, int col, int h) {//递归深搜if (row < 1 || row > R || col < 1 || col > R || h <= map[row][col])//超出范围或上一点高度低于该点高度return 0;//则返回0if (record[row][col] >= 0)//如果已经搜索过return record[row][col];//则直接返回该点最大化学长度record[row][col] = max(dfs(row - 1, col, map[row][col]),dfs(row, col + 1, map[row][col]), dfs(row + 1, col, map[row][col]),dfs(row, col - 1, map[row][col])) + 1;//动规,当前最大滑雪长度为四周比该点低的最大滑雪长度加1return record[row][col];}int main(void) {int T, i, j;scanf("%d", &T);while (T--) {memset(record, -1, sizeof(record));scanf("%d%d", &R, &C);for (i = 1; i <= R; ++i) {for (j = 1; j <= R; ++j) {scanf("%d", &map[i][j]);}}int max = 0;for (i = 1; i <= R; ++i) {for (j = 1; j <= R; ++j) {int num = dfs(i, j, 0xffffff);//通过16进制0xffffff方便地给出一个足够大的int型if (max < num)max = num;}}printf("%d\n", max);}return 0;}


0 0