POJ1088(二维最长下降序列?)(我觉得是搜索)
2018-01-17 18:53
351 查看
题目链接
滑雪
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 102305 Accepted: 38923
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[i][j]:i,j点出发所能达到的最长值。
遍历一遍数组,然后计算当前点的上下左右点的dp值,选最大的赋给当前点的dp值。
记忆化搜索。
滑雪
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 102305 Accepted: 38923
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[i][j]:i,j点出发所能达到的最长值。
遍历一遍数组,然后计算当前点的上下左右点的dp值,选最大的赋给当前点的dp值。
记忆化搜索。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,m,ans; int num[105][105],dp[105][105]; int dir[4][2] = {1,0,0,1,-1,0,0,-1}; int solve(int x, int y) { if(dp[x][y] != 0) return dp[x][y]; int xx,yy,temp = 1; for (int i = 0; i < 4; i++) { xx = x + dir[i][0]; yy = y + dir[i][1]; if(xx < 0 || xx >= n || yy < 0 || yy >= m) continue; if(num[xx][yy] < num[x][y]) { temp = max(solve(xx,yy) + 1,temp); } } return temp; } int main() { while(~scanf("%d %d",&n,&m)) { ans = 0; memset(num,0,sizeof num); memset(dp,0,sizeof dp); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d",&num[i][j]); } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { dp[i][j] = solve(i,j); ans = max(ans,dp[i][j]); } } printf("%d\n",ans); } }
相关文章推荐
- [dp]poj1088_滑雪 二维形式的最长下降子序列
- [poj1088]滑雪(二维最长下降子序列)
- 分支限界法解决 二维最长下降序列问题(滑雪场问题)
- 求最长不下降序列
- 求最长不下降序列-SSL 1459
- 【HDU6197 2017 ACM ICPC Asia Regional Shenyang Online D】【LIS 最长不下降序列】array array array 数列删除恰好K个数,使得恰好
- 最长不下降子序列(LIS)
- 最长不下降子序列的O(n*logn)算法
- 最长不下降子序列的O(n)算法
- 最长不下降子序列 (O(nlogn)算法)
- 洛谷P2766:最长不下降子序列问题
- LIS(Longest Increasing Subsequence)最长上升(不下降)子序列
- 导弹拦截(最长下降子序列 dp)
- hdu1160 FatMouse's Speed 最长下降子序列 及其打印
- Vijous系列(1)LIS 最长不下降子序列的应用
- lintcode 最长上升连续子序列 II(二维最长上升连续序列)
- 最长不下降序列(HNOI’97)
- 最长不下降子序列 输出方案数
- hdu 4604 Deque(最长上升与下降子序列-能够重复)
- 求最长不下降序列(逆推)