POJ1088
来源:互联网 发布:天猫双十一直播数据 编辑:程序博客网 时间:2024/06/05 17:18
滑雪
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
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更长。事实上,这是最长的一条。
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
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
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更长。事实上,这是最长的一条。
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
解题思路:
大意就是在图里求一条最长的递减序列,输出递减序列的长度。记忆化搜索,首先把dp数组初始化为1,然后两层循环,
用dp[ i ][ j ]来存每个点搜索到的路径长度,并且更新最大路径长度。搜索时在每个点沿四个方向搜,更新maxx,得出的路径
长度h等于gethigh值加1.
AC代码:
#include <functional>#include <algorithm>#include <iostream>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cstring>#include <cassert>#include <cstdio>#include <string>#include <vector>#include <bitset>#include <queue>#include <stack>#include <cmath>#include <ctime>#include <list>#include <set>#include <map>#define REP0(i, n) for (int i=0;i<int(n);++i)#define REP1(i, n) for (int i=1;i<=int(n);++i)#define FOR(i, a, b) for (int i=int(a);i<int(b);++i)#define DWN(i, b, a) for (int i=int(b-1);i>=int(a);--i)using namespace std;#define REP(i, n) for (int i=0;i<int(n);++i)#define FOR(i, a, b) for (int i=int(a);i<int(b);++i)#define DWN(i, b, a) for (int i=int(b-1);i>=int(a);--i)#define REP_1(i, n) for (int i=1;i<=int(n);++i)#define FOR_1(i, a, b) for (int i=int(a);i<=int(b);++i)#define DWN_1(i, b, a) for (int i=int(b);i>=int(a);--i)#define REP_C(i, n) for (int n____=int(n),i=0;i<n____;++i)#define FOR_C(i, a, b) for (int b____=int(b),i=a;i<b____;++i)#define DWN_C(i, b, a) for (int a____=int(a),i=b-1;i>=a____;--i)#define REP_N(i, n) for (i=0;i<int(n);++i)#define FOR_N(i, a, b) for (i=int(a);i<int(b);++i)#define DWN_N(i, b, a) for (i=int(b-1);i>=int(a);--i)#define REP_1_C(i, n) for (int n____=int(n),i=1;i<=n____;++i)#define FOR_1_C(i, a, b) for (int b____=int(b),i=a;i<=b____;++i)#define DWN_1_C(i, b, a) for (int a____=int(a),i=b;i>=a____;--i)#define REP_1_N(i, n) for (i=1;i<=int(n);++i)#define FOR_1_N(i, a, b) for (i=int(a);i<=int(b);++i)#define DWN_1_N(i, b, a) for (i=int(b);i>=int(a);--i)#define REP_C_N(i, n) for (n____=int(n),i=0;i<n____;++i)#define FOR_C_N(i, a, b) for (b____=int(b),i=a;i<b____;++i)#define DWN_C_N(i, b, a) for (a____=int(a),i=b-1;i>=a____;--i)#define REP_1_C_N(i, n) for (n____=int(n),i=1;i<=n____;++i)#define FOR_1_C_N(i, a, b) for (b____=int(b),i=a;i<=b____;++i)#define DWN_1_C_N(i, b, a) for (a____=int(a),i=b;i>=a____;--i)//#define ECH(it, A) for (typeof(A.begin()) it=A.begin(); it != A.end(); ++it)#define ECH(it, A) for (__typeof(A.begin()) it=A.begin(); it != A.end(); ++it)#define REP_S(it, str) for (char*it=str;*it;++it) // 用于字符串的 .. .#define REP_G(it, u) for (int it=hd[u];it;it=suc[it]) // 用于图论的 .. .#define DO(n) for ( int ____n ## __line__ = n; ____n ## __line__ -- ; )#define REP_2(i, j, n, m) REP(i, n) REP(j, m)#define REP_2_1(i, j, n, m) REP_1(i, n) REP_1(j, m)#define REP_3(i, j, k, n, m, l) REP(i, n) REP(j, m) REP(k, l)#define REP_3_1(i, j, k, n, m, l) REP_1(i, n) REP_1(j, m) REP_1(k, l)#define ALL(A) A.begin(), A.end()#define LLA(A) A.rbegin(), A.rend()#define CPY(A, B) memcpy(A, B, sizeof(A))#define INS(A, P, B) A.insert(A.begin() + P, B)#define ERS(A, P) A.erase(A.begin() + P)#define BSC(A, X) find(ALL(A), X) // != A.end()#define CTN(T, x) (T.find(x) != T.end())#define SZ(A) int(A.size())#define PB push_back#define MP(A, B) make_pair(A, B)#define PTT pair<T, T>#define fi first#define se second#define Rush int T____; RD(T____); DO(T____)#define Display(A, n, m) { \ REP(i, n){ \ REP(j, m) cout << A[i][j] << " "; \ cout << endl; \ } \}#define Display_1(A, n, m) { \ REP_1(i, n){ \ REP_1(j, m) cout << A[i][j] << " "; \ cout << endl; \ } \}typedef long long LL;typedef double DB;const int dx[] = {-1, 0, 1, 0};const int dy[] = {0, 1, 0, -1};const int MOD = 1000000007;//int MOD = 99990001;const int INF = 0x3f3f3f3f;const LL INFF = 1LL << 60;const DB EPS = 1e-9;const DB OO = 1e15;const DB PI = acos(-1.0); //M_PI;#define N 101int maps[N][N] , dp[N][N];int r , c , i , j , h;int gethigh(int i , int j){ if(dp[i][j] > 1) return dp[i][j]; int maxx = 1; if(maps[i][j] > maps[i][j-1] && j - 1 >= 0) { h = gethigh(i , j - 1) + 1; if(h > maxx) maxx = h; } if(maps[i][j] > maps[i][j+1] && j + 1 < c) { h = gethigh(i , j + 1) + 1; if(h > maxx) maxx = h; } if(maps[i][j] > maps[i-1][j] && i - 1 >= 0) { h = gethigh(i - 1, j) + 1; if(h > maxx) maxx = h; } if(maps[i][j] >maps[i+1][j] && i + 1 < r) { h = gethigh(i + 1, j) + 1; if(h > maxx) maxx = h; } return maxx;}int main(){ #ifdef ZH freopen("in.txt","r",stdin); #endif while(~scanf("%d%d",&r,&c)) { REP(i , r) { REP(j, c) { scanf("%d",&maps[i][j]); dp[i][j] = 1; } } int res = 0; REP(i , r) { REP(j , c) { dp[i][j] = gethigh(i , j); if(dp[i][j] > res) res = dp[i][j]; } } printf("%d\n",res); }}
0 0
- POJ1088
- poj1088
- POJ1088
- POJ1088
- Poj1088
- poj1088
- POJ1088
- poj1088
- poj1088
- poj1088
- poj1088
- poj1088
- POJ1088
- POJ1088
- poj1088
- poj1088
- poj1088
- poj1088
- 48 小明的调查作业
- 【web开发学习笔记】Hibernate学习总结
- python中的对象拷贝
- 50 爱摘苹果的小明
- poj 1753
- POJ1088
- java不求有功,但求无过—异常处理
- Qt实现窗口拖动
- JAVA中管道通讯(线程间通讯)例子
- rtp h264注意点(FU-A分包方式说明)
- 笔记62--WindowManager
- UVA10047
- 分解质因数
- 高斯公式