最长滑雪路径

来源:互联网 发布:淘宝商城女装晚礼服 编辑:程序博客网 时间:2024/05/16 14:05
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 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

思想(动态规划):f[i][j]保存m[i][j]这个点为终点的最长路径,那么f[i][j]的确定可以是上下左右四个方向滑向m[i][j],取四个方向的最大值在+1就可以了

#include<iostream>#include<vector>#include<memory.h>using namespace std;inline int  max(int a, int b) {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 f[100][100];//全局变量自动初始化为0,f中是该点的最大值int R, C;int m[100][100];int dfs(int row, int col, int h){if (row < 0 || col < 0 || row >= R || col >= C || h <= m[row][col])//注意顺序。如果h <= m[row][col]会由于先判断而row越界出错{return 0;}if (f[row][col] >= 0)//已经搜索过,直接返回{return f[row][col];}//四个方向f[row][col] = max(dfs(row - 1, col, m[row][col]),//上dfs(row, col + 1, m[row][col]),//右dfs(row + 1, col, m[row][col]),//下dfs(row, col - 1, m[row][col]))+1;//左 return f[row][col];}int main(){int c, num;int  max;cin >> c;while (c--){//cin >> R;//cin >> C;max = 0;cout << sizeof(f) << endl;for (int i = 0; i < 10;i++)for (int j = 0; j < 10; j++)cout << f[i][j] <<" ";for (int i = 0; i < R; i++){for (int j = 0; j < C; j++){cin >> num;m[i][j] = num;f[i][j] = -1;}}for (int i = 0; i < R; i++){for (int j = 0; j < C; j++){int current = dfs(i, j, 10002);if (current > max)max = current;}}cout << max << endl;}system("pause");return 0;}


0 0
原创粉丝点击