递推型DP

将每个滑雪点都看作起点,从最低点开始逐个由四周递推出到达此点的最长路径的长度,由该点记下。

理论上,也可以将每一点都看作终点,由最高点开始计数,有兴趣可以试试。

//经典DP-由高向低海拔滑雪-求最长路
//Memory:372K Time:16 Ms
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; #define MAX 105 int row, col, len;
int map[MAX][MAX]; //标准记录
int mov[][] = { { , },{ -, },{ , },{ , - } };
int d[MAX][MAX]; //dp[]
int ans; /*各点属性*/
struct Node {
int x, y; //坐标(x,y)
int value; //海拔
}node[MAX*MAX]; bool operator < (const Node a, const Node b)
{
return a.value < b.value;
} void DP()
{
ans = ;
memset(d, , sizeof(d));
for (int i = ; i < len; i++)
{
int x = node[i].x, y = node[i].y;
for (int j = ; j < ; j++)
{
int tx = x + mov[j][];
int ty = y + mov[j][];
if (tx >= && tx < row && ty >= && ty < col)
{
if (map[x][y] > map[tx][ty])
d[x][y] = max(d[x][y], d[tx][ty] + );
}
d[x][y] = max(, d[x][y]);
}
ans = max(ans, d[x][y]);
}
return;
} int main()
{
scanf("%d%d", &row, &col);
len = ;
for (int i = ; i < row; i++)
{
for (int j = ; j < col; j++)
{
scanf("%d", &map[i][j]);
node[len].x = i;
node[len].y = j;
node[len++].value = map[i][j];
}
}
sort(node, node + len); //将各点按照-升序-排列
DP();
printf("%d\n", ans);
return ;
}

记忆化搜索型DP

  不必排序,解法和思路也相对更加清晰

  

 //经典DP-由高向低海拔滑雪-求最长路
//Memory:252K Time:16 Ms
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; #define max(x,y) ((x)>(y)?(x):(y))
#define MAX 105 int row, col;
int map[MAX][MAX]; //标准记录
int mov[][] = { { , },{ -, },{ , },{ , - } };
int d[MAX][MAX]; //distance
int ans; int DFS(int x, int y)
{
if (d[x][y]) return d[x][y]; for (int i = ; i < ; i++)
{
int tx = x + mov[i][];
int ty = y + mov[i][];
if (tx >= && tx < row && ty >= && ty < col)
if (map[tx][ty] < map[x][y]) //向下滑雪
d[x][y] = max(DFS(tx, ty) + , d[x][y]);
} ans = max(d[x][y], ans);
return d[x][y];
} int main()
{
scanf("%d%d", &row, &col); for (int i = ; i < row; i++)
for (int j = ; j < col; j++)
scanf("%d", &map[i][j]); memset(d, , sizeof(d));
for (int i = ; i < row; i++)
for (int j = ; j < col;j++)
DFS(i,j); printf("%d\n", ans + );
return ;
}

ACM/ICPC 之 简单DP-记忆化搜索与递推(POJ1088-滑雪)的更多相关文章

  1. 由DAG到背包问题——记忆化搜索和递推两种解法

    一.问题描述 物品无限的背包问题:有n种物品,每种均有无穷多个.第 i 种物品的体积为Vi,重量为Wi.选一些物品装到一个容量为 C 的背包中,求使得背包内物品总体积不超过C的前提下重量的最大值.1≤ ...

  2. ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. Poor Ramzi -dp+记忆化搜索

    ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. ...

  3. POJ 1088 DP=记忆化搜索

    话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...

  4. 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索

    题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...

  5. 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索

    [题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...

  6. [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树

    树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...

  7. poj1664 dp记忆化搜索

    http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...

  8. 状压DP+记忆化搜索 UVA 1252 Twenty Questions

    题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...

  9. ACM学习历程—POJ1088 滑雪(dp && 记忆化搜索)

    Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...

随机推荐

  1. VMnet1和V8

    vmware默认使用了两个虚拟网卡: vmnet1 v1 vmnet8 v8 vmnet1是host-only,也就是说,选择用vmnet1的话就相当于VMware给你提供了一个虚拟交换机,仅将虚拟机 ...

  2. C语言内存管理(转)

    伟大的Bill Gates 曾经失言: 640K ought to be enough for everybody — Bill Gates 1981 程序员们经常编写内存管理程序,往往提心吊胆.如果 ...

  3. EDW on Hadoop(Hadoop上的数据仓库)技术选型和实践思考

    在这篇文章中, 将讨论EDW on Hadoop 有哪些备选方案, 以及我个人的倾向性, 最后是建构方法.  欢迎转载, 但必须注明原贴(刘忠武,  http://www.cnblogs.com/ha ...

  4. Win7与XP共享互相访问及共享注意事项!

    win7共享方法和XP类似,主要需要检查以下操作: 1,首先将Guest账户打开 2,右击文件夹-属性-共享选项-高级共享 3,将共享文件√打上,应用-确定即可! 4,查看自己IP(开始-运行-cmd ...

  5. nyoj 613 免费馅饼 广搜

    免费馅饼 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...

  6. ajax如何返回多个值

    应用场景:  在前端有个ajax请求到后端后,需要返回多个变量的值,在这里使用的是Json格式作为值传递,使用eval函数来解析Json格式. 要传递的值data: var data = " ...

  7. webrtc公开课

    http://blog.csdn.net/yangzhenping/article/details/51152376 http://edu.csdn.net/huiyiCourse/live

  8. 使用Ant部署应用程序系统

    1. 首先下载Ant http://ant.apache.org/ 配置环境变量 2. 编写build.xml部署文件如下: <?xml version="1.0" enco ...

  9. Android学习笔记(五)——活动的生命周期

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 为了能写出流畅连贯的程序,我们需要了解一下活动的生命周期. 一.返回栈 Android 中的活动是可以层叠的. ...

  10. canvas 中save和restore的用法

    在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法. onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布. 在onDraw方法里,我们经常会 ...