poj 1088 滑雪 【记忆化搜索】+【DFS】

策略:如题

题目链接:http://poj.org/problem?id=1088

代码:

#include<stdio.h>
#include<string.h>
int map[105][105], dp[105][105], n, m;
const int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0}; //四个方向
int limit(int x, int y)  //判断是不是越界了
{
	if(x<1||x>n||y<1||y>m) return 0;
	return 1;
}
int dfs(int x, int y)  查找
{
	if(dp[x][y]) return dp[x][y];  //如果以前找找过了,就不用再找了, 记忆化搜索
	int pre, flag, sum, i;  //flag 是标记周围有没有比他小的高度, pre是储存周围某一方向的长度, sum是选择四个方向最大的长度
	pre = sum = flag = 0;
	for( i =0; i < 4; i ++){
		int nx = x+dir[i][0];
		int ny = y+dir[i][1];
		if( limit(nx, ny)&&map[nx][ny] < map[x][y]){
			pre = dfs(nx, ny);
			sum = sum>pre?sum:pre;
			flag = 1;
		}
	}
	if(flag) dp[x][y] =sum+1;
	else dp[x][y] = 1;<strong></strong><pre name="code" class="cpp" style="display: inline !important; "><strong style="font-family: Arial, Helvetica, sans-serif; white-space: normal; background-color: rgb(255, 255, 255); "></strong><pre name="code" class="cpp" style="display: inline !important; "><strong style="font-family: Arial, Helvetica, sans-serif; white-space: normal; background-color: rgb(255, 255, 255); "></strong><pre name="code" class="cpp" style="display: inline !important; ">//如果flag == 0,就意味着周围没有比他低的高度, 就将该处赋值为1


return dp[x][y];}int main(){int i, j;while(scanf("%d%d", &n, &m) == 2){for(i = 1; i <= n; i ++)for(j = 1; j<= m; j ++)scanf("%d", &map[i][j]);int max = 0;memset(dp, 0, sizeof(dp)); //初始化for(i = 1; i <= n; i ++)for(j = 1; j <= m; j ++){dp[i][j] = dfs(i, j);//
printf("%d..", dp[i][j]);if(max < dp[i][j]) //找最大的max = dp[i][j];}printf("%d\n", max);}return 0;}


poj 1088 滑雪 【记忆化搜索】+【DFS】

时间: 2024-12-04 16:16:46

poj 1088 滑雪 【记忆化搜索】+【DFS】的相关文章

[ACM] poj 1088 滑雪 (记忆化搜索DFS)

求n*m网格内矩形的数目[ACM] poj 1088 滑雪 (记忆化搜索DFS),布布扣,bubuko.com

POJ 1088 滑雪(记忆化搜索+dfs)

滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 83489   Accepted: 31234 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17

POJ 1088 滑雪 记忆化搜索

解析:状态d[i][j]代表r=i , c=j这个位置能滑的最大长度.深搜+备忘录 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn=100+5; int R,C; int a[maxn][maxn]; int d[maxn][maxn]; int dr[]={0,-1,0,1};

POJ 1088滑雪 记忆化搜索

#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <cstdlib> #include <cmath> #include <set> #include <map> #include <vector> #include <cstri

POJ 1088 滑雪 记忆化优化题解

本题有人写是DP,不过和DP还是有点差别的,应该主要是记忆化 Momoization 算法. 思路就是递归,然后在递归的过程把计算的结果记录起来,以便后面使用. 很经典的搜索题目,这种方法很多题目考到的. 关键还是如何把代码写清晰工整了,O(∩_∩)O~. #include <stdio.h> const int MAX_N = 101; int R, C; int arr[MAX_N][MAX_N]; int tbl[MAX_N][MAX_N]; inline int max(int a,

poj 3156 hash+记忆化搜索 期望dp

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,m; #define N 32 #define mod 10007LL #define mod2 10000007 #define inf 0x3fffffff typedef long long ll; typedef double dd; int f[N]

记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty

题目传送门 1 /* 2 题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1 3 记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操作必然是1红1黑 4 考虑三种情况:a[]连续两个颜色相同,输出11:b[]连续两个相同,输出22: 5 a[x] != b[y], 输出12:否则Impossible 6 详细解释:http://blog.csdn.net/jsun_moon/article/details/10254

记忆化搜索+DFS URAL 1183 Brackets Sequence

题目传送门 1 /* 2 记忆化搜索+DFS:dp[i][j] 表示第i到第j个字符,最少要加多少个括号 3 dp[x][x] = 1 一定要加一个括号:dp[x][y] = 0, x > y; 4 当s[x] 与 s[y] 匹配,则搜索 (x+1, y-1); 否则在x~y-1枚举找到相匹配的括号,更新最小值 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cmath> 9 #include

POJ 4968 DP||记忆化搜索

给出N个人的平局分X 根据GPA规则计算可能的最高平均GPA和最低平均GPA 可以DP预处理出来所有结果  或者记忆化搜索 DP: #include "stdio.h" #include "string.h" int inf=100000000; double a[11][1100],b[11][1100]; double Max(double a,double b) { if (a<b) return b; else return a; } double M

tyvj 1004 滑雪 记忆化搜索

滑雪 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.tyvj.cn/p/1004 Description trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形.为了得到更快的速度,滑行的路线必须向下倾斜.    例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一.例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条. Input 输入文件