DP:Skiing(POJ 1088)

题目是中文的,要读懂题目其实不难
其实这道题挺经典的,我们这样想,他最终要找到一个最大值,这个时候我们就想到要用动态规划
那怎么用呢?我们同时这样想,由于滑雪的最高点我们不能立马找出来,而且也不一定是最高点就是最长路径的起点。所以我们要不断搜索,我们知道对图的搜索有BFS和DFS,从题目上看,我们应该需要从头走到尾直到找不到路为止,所以我们这题要用DFS,同时,结合我们要用动态规划的思想,我们应该再弄一个矩阵,来保存前面搜索过的路经长,一个点的邻接点如果还没有被搜索过,我们就进入搜索,否则,我们应该直接引用前面已经保存过的路经长,并把搜索过的节点进行标记。
而这样的方法,就是经典的记忆化搜索方法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX(a,b) (a)>(b)?(a):(b) typedef struct map
{
int Known;
int dist;
}Dist_Map; Dist_Map dp[][];
int Input_Map[][]; int Search(const int, const int, int *const, int, int); int main(void)
{
int R, C, i, j, Max_Length;
while (~scanf("%d%d",&R,&C))
{
Max_Length = ; memset(dp, , sizeof(dp));
for (i = ; i < R; i++)//读图
for (j = ; j < C; j++)
scanf("%d", &Input_Map[i][j]); for (i = ; i < R; i++)
for (j = ; j < C; j++)
if (!dp[i][j].Known)
Search(R, C, &Max_Length, i, j);
printf("%d\n", Max_Length);
}
return ;
} int Search(const int R, const int C, int *const Max_Length, int py, int px)
{
int re_ans;
dp[py][px].Known = ; dp[py][px].dist = ; if (py - >= && Input_Map[py][px] > Input_Map[py - ][px])
{
if (!dp[py - ][px].Known)
re_ans = Search(R, C, Max_Length, py - , px);
else
re_ans = dp[py - ][px].dist;
dp[py][px].dist = MAX(re_ans + , dp[py][px].dist); }
if (py + < R && Input_Map[py][px] > Input_Map[py + ][px])
{
if (!dp[py + ][px].Known)
re_ans = Search(R, C, Max_Length, py + , px);
else
re_ans = dp[py + ][px].dist;
dp[py][px].dist = MAX(re_ans + , dp[py][px].dist);
}
if (px - >= && Input_Map[py][px] > Input_Map[py][px - ])
{
if (!dp[py][px - ].Known)
re_ans = Search(R, C, Max_Length, py, px - );
else
re_ans = dp[py][px - ].dist;
dp[py][px].dist = MAX(re_ans + , dp[py][px].dist);
}
if (px + < C && Input_Map[py][px] > Input_Map[py][px + ])
{
if (!dp[py][px + ].Known)
re_ans = Search(R, C, Max_Length, py, px + );
else
re_ans = dp[py][px + ].dist;
dp[py][px].dist = MAX(re_ans + , dp[py][px].dist);
} *Max_Length = MAX(dp[py][px].dist, *Max_Length);
return dp[py][px].dist;
}
DP:Skiing(POJ 1088)的更多相关文章
- 树形dp入门(poj 2342 Anniversary party)
题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上司,现在已知每个人的活跃指数和上司关系(当然不可能存在环),求邀请哪些人(多少人)来能使得晚 ...
- 01背包问题:Charm Bracelet (POJ 3624)(外加一个常数的优化)
Charm Bracelet POJ 3624 就是一道典型的01背包问题: #include<iostream> #include<stdio.h> #include& ...
- Scout YYF I(POJ 3744)
Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5565 Accepted: 1553 Descr ...
- Skiing(最短路)
poj——3037 Skiing Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4921 Accepted: 1315 ...
- Collecting Bugs(POJ 2096)
Collecting Bugs Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 3064 Accepted: 1505 ...
- HDU 5396 Expression(DP+组合数)(详解)
题目大意: 给你一个n然后是n个数. 然后是n-1个操作符,操作符是插入在两个数字之间的. 由于你不同的运算顺序,会产生不同的结果. 比如: 1 + 1 * 2 有两种 (1+1)*2 或者 ...
- HDU 2829 Lawrence(四边形优化DP O(n^2))
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2829 题目大意:有一段铁路有n个站,每个站可以往其他站运送粮草,现在要炸掉m条路使得粮草补给最小,粮草 ...
- HDU 2829 Lawrence(斜率优化DP O(n^2))
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2829 题目大意:有一段铁路有n个站,每个站可以往其他站运送粮草,现在要炸掉m条路使得粮草补给最小,粮草 ...
- 三十道DP练习(持续更新)(pw:DP)
前言: 话说DP这种纯考思维的题目,总是让我很伤脑筋,一些特别简单的DP我都常常做不出来,所以革命从现在(2018-05-01)开始,努力多刷点DP的练习-. 1.顺序对齐(align) 时间:201 ...
随机推荐
- 【bzoj1016】 JSOI2008—最小生成树计数
http://www.lydsy.com/JudgeOnline/problem.php?id=1016 (题目链接) 题意 求图的最小生成树计数. Solution %了下题解,发现要写矩阵树,15 ...
- [NOIP2010] 提高组 洛谷P1514 引水入城
题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...
- 用word写博客
都知道word的编辑功能强大,那如何用word写博客呢? 以博客园为例 1.写好word文档后,文件->共享->发送至博客,或者新建博客模板 2. 再博客的界面点击管理账户,新建账户,如果 ...
- Jquery-easyUI-datagrid参数之 queryParams
http://blog.163.com/xpf_designer/blog/static/19213618920117784055668/ Html <div region="cen ...
- 从系统的gallery获取图片
1 ) 效果演示: 2代码演示 布局代码:
- ThinkPHP 购物商城网站(数据库中增删改查的功能实现)——————重点——————
控制器 ---------------------GoodsController.class.php------------------------------------------------- ...
- 修复VirtualBox "This kernel requires the following features not present on the CPU: pae Unable to boot
问题描述: 1.机器:Linux主机,特别是主机为大内存,比如: 4G内存的使用pae内核的Ubuntu系统的dell电脑. 2.情况:使用VirtualBox安装Linux系统时,比如:通过Virt ...
- _stdcall与_cdecl(了解)
调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议.这种协议规定了该语言的函数中的参数传送方式.参数是否可变和由谁来处理堆栈等问题.不同的语言定义了不 ...
- ThinkPad紧凑型蓝牙键盘(0B47189)鼠标滚轮用法,F1到F12功能键的功能切换以及其他技巧
入手小红点蓝牙键盘(ThinkPad Compact Bluetooth),手感极佳,小红点特别适合程序员工作,双手无需离开键盘就可以操作鼠标,完全解决肩部.腕部疲劳酸痛问题,程序员健康的大福音! 使 ...
- CentOS 设置网络(修改IP&修改网关&修改DNS)--update.14.08.15
自己电脑上装的虚拟机用桥接方式连接物理机,虚拟机重启后ip会发生变化,非常阻碍Xshell的连接和hosts指定的dns. 通过修改IP为static模式,保持IP不变. ============== ...