DP 记忆化搜索 poj 1088
2012-08-23 21:43
211 查看
滑雪
Description
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。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
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 60568 | Accepted: 22075 |
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) 因为如果只是单纯的深搜,那么可能会超时。 记忆化搜索时,边搜边将每一点搜索的结果保存下来,作为下一次来用;这样后面的搜索就会快很多。从最高层开始,一层层往下递推,直到最底层。然后每一层的结果都进行保存,又向上叠加 回到顶点。其中dp数组中定义的是:该点上最大的下滑区域长度。 编码时,一直没有弄清楚的是,在搜索时,到底要不要标记点,也就是是不是被搜索过的点在以后就不能被再次搜索。答案是不需要标记。 而且,搜索时,不止是将(0,0)点进行深搜,因为在进行深搜时;会因为高度的原因,有些的点没有搜索到。所以,将所有的点循环一次,将没有标记的点进行深搜。 代码实现:
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; int a[1000][1000]; int dp[1000][1000]; int vis[1000][1000]; int ax[4]={0,0,-1,1}; int ay[4]={1,-1,0,0}; int n,m; int DFS(int x,int y){ if(dp[x][y]>=0){ // vis[x][y]=1; return dp[x][y]; } int maxn=1; for(int k=0;k<4;k++){ int temp1=x+ax[k]; int temp2=y+ay[k]; if(temp1>=0&&temp1<n&&temp2>=0&&temp2<m&&a[temp1][temp2]>a[x][y]){ int len=DFS(temp1,temp2); if(len+1>maxn) maxn=len+1; } } dp[x][y]=maxn; return dp[x][y]; } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ memset(dp,-1,sizeof(dp)); // memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ scanf("%d",&a[i][j]); } } int maxn=0; for(int g=0;g<n;g++){ for(int h=0;h<m;h++){ // memset(vis,0,sizeof(vis)); // dp[g][h]=-1; int sum=DFS(g,h); if(maxn<sum) maxn=sum; } } printf("%d\n",maxn); } return 0; }
相关文章推荐
- POJ 1088 滑雪 记忆化搜索(搜索 + dp)
- poj 1088/nyoj 10 滑雪(记忆化搜索/DP)
- POJ_1088_(dp)(记忆化搜索)
- POJ-1088 滑雪 (记忆化搜索,dp)
- poj 1088 滑雪(记忆化搜索 || DP)
- poj 1088 滑雪 DP(dfs的记忆化搜索)
- POJ-1088 滑雪 (记忆化搜索,dp)
- poj——1088(dp之递归加记忆化搜索)
- POJ 1088 滑雪 排序后 dp 或者 记忆化搜索 两种写法
- DP 记忆化搜索 poj 1088
- dp——记忆化搜索——poj 1088
- poj1088 Dp,记忆化搜索
- POJ 1088 DP || 记忆化搜索
- poj1088 dp 记忆化搜索 (入门好题)
- poj 1088滑雪(记忆化搜索, dp)
- POJ 1088 DP=记忆化搜索
- poj 1088 滑雪 记忆化搜索
- POJ 1088(dp)
- POJ 1088 滑雪(记忆化搜索+dfs)
- POJ 1088 滑雪 解题报告(记忆化搜索)