OpenJudge/Poj 1088 滑雪
2014-03-06 11:24
411 查看
1.链接地址:
bailian.openjudge.cn/practice/1088
http://poj.org/problem?id=1088
2.题目:
3.思路:
动态规划,先按照高度降序排序,再依次计算
刚开始想当然,以为从最高高度寻找一个路径一定是最长,所以使用了优先队列+广搜,白白WA了一次
4.代码:
bailian.openjudge.cn/practice/1088
http://poj.org/problem?id=1088
2.题目:
总Time Limit:1000msMemory Limit:65536kBDescriptionMichael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个 区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。Input输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。Output输出最长区域的长度。Sample Input
Sample Output
SourceDon't know
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更长。事实上,这是最长的一条。Input输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。Output输出最长区域的长度。Sample Input
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
Sample Output
25
SourceDon't know
3.思路:
动态规划,先按照高度降序排序,再依次计算
刚开始想当然,以为从最高高度寻找一个路径一定是最长,所以使用了优先队列+广搜,白白WA了一次
4.代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; struct PATH { int x; int y; int height; }; int cmp(const void* a,const void *b) { PATH *p1 = (PATH *) a; PATH *p2 = (PATH *) b; return p2->height - p1->height; } int main() { //freopen("C://input.txt","r",stdin); int r,c; cin >> r >> c; int i,j; int **arr_height = new int*[r]; for(i = 0; i < r; ++i) arr_height[i] = new int[c]; int **arr_mark = new int*[r]; for(i = 0; i < r; ++i) { arr_mark[i] = new int[c]; memset(arr_mark[i],0,sizeof(int) * c); } PATH *arr_path = new PATH[r * c]; for(i = 0; i < r; ++i) { for(j = 0; j < c; ++j) { cin >> arr_height[i][j]; arr_path[i * c + j].x = j; arr_path[i * c + j].y = i; arr_path[i * c + j].height = arr_height[i][j]; } } qsort(arr_path,r * c,sizeof(PATH),cmp); int idx_x[] = {-1,1,0,0}; int idx_y[] = {0,0,1,-1}; int res = 0; for(i = 0; i < r * c; ++i) { //cout << arr_path[i].height << " " << arr_path[i].x << " " << arr_path[i].y << endl; int max = 0; for(j = 0; j < 4; ++j) { int temp_x = arr_path[i].x + idx_x[j]; int temp_y = arr_path[i].y + idx_y[j]; if(temp_x < 0 || temp_x >= c || temp_y < 0 || temp_y >= r) continue; if(arr_height[temp_y][temp_x] > arr_height[arr_path[i].y][arr_path[i].x] && max < arr_mark[temp_y][temp_x]) { max = arr_mark[temp_y][temp_x]; } } arr_mark[arr_path[i].y][arr_path[i].x] = max + 1; if(res < max + 1) res = max + 1; } cout << res << endl; delete [] arr_path; for(i = 0; i < r; ++i) delete [] arr_height[i]; delete [] arr_height; for(i = 0; i < r; ++i) delete [] arr_mark[i]; delete [] arr_mark; return 0; }
相关文章推荐
- OpenJudge/Poj 1088 滑雪
- OpenJudge/Poj 1664 放苹果
- poj1088 滑雪(dfs)
- DP::Poj1088 滑雪
- poj1088 滑雪
- Poj OpenJudge 百练 2602 Superlong sums
- POJ 1088 滑雪
- 滑雪 - POJ 1088 水题
- poj 1088 滑雪问题http://poj.org/problem?id=1088
- POJ 1088 滑雪
- POJ 1088 滑雪 && NYOJ 10 skiing
- poj 1088 滑雪 (记忆化 Dp)
- OpenJudge / Poj 2141 Message Decowding
- Poj OpenJudge 百练 2389 Bull Math
- POJ 【1088】 滑雪
- poj 1088 滑雪 简单的记忆化搜索/dp
- poj 1088 滑雪
- poj 1088 滑雪(线性DP)
- POJ 1088 滑雪
- 【POJ 1088】滑雪