3.滑雪-深搜&dp

//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更长。事实上,这是最长的一条。
//
//输入描述
//
//输入的第一行表示区域的行数R和列数C(1<=R,C<=100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
//
//
//输出描述
//
//输出最长区域的长度。
//
//
//输入样例
//
//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
//
//
//输出样例
//
//25

#include <iostream>
using namespace std;

int m, n;
int a[105][105];  //符合题意即可,不要太大,否则耗时太多
int dp[105][105];
int count = 0;

int valid(int x, int y){
    return (x >= 0 && x <= m && y >= 0 && y <= n);
}

int dfs(int x, int y){
    if(dp[x][y] != -1)   //不为-1表示已经搜索过,直接取,避免重复搜索耗时
        return dp[x][y];
    int all = 0;
    if(valid(x, y) && a[x][y] >= a[x - 1][y])
        all = max(all, 1 + dfs(x-1, y));
    if(valid(x, y) && a[x][y] >= a[x + 1][y])
        all = max(all, 1 + dfs(x + 1, y));
    if(valid(x, y) && a[x][y] >= a[x][y - 1])
        all = max(all, 1 + dfs(x, y - 1));
    if(valid(x, y) && a[x][y] >= a[x][y + 1])
        all = max(all, 1 + dfs(x, y + 1));
    if(all == 0)
        return 1;
    else{
        return all;
    }
}

int main(){
    int max = 0;
    cin >> m >> n;
    for(int i = 0; i < m; i++)
        for(int j = 0; j < n; j++){
            cin >> a[i][j];
            dp[i][j] = -1;  //初始化为-1
        }
    
    for(int i = 0; i < m; i++)
        for(int j = 0; j < n; j++){
//            max = dfs(i, j);
            if(max < dfs(i, j))
                max = dfs(i, j);
        }
    cout << max;
    return 0;
}

时间: 2024-10-10 23:18:48

3.滑雪-深搜&dp的相关文章

嵌套矩形 DAG上的dp(深搜+dp)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一

深搜+DP剪枝 codevs 1047 邮票面值设计

codevs 1047 邮票面值设计 1999年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤40)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1-MAX之间的每一个邮资值都能得到. 例如,N=3,K=2,如果面值分别为1分.4分,则在1分-6分之间的每一个邮资值都能得到(当然还有8分.9分和1

ZOJ1100 状压DP +深搜

记得做过类似于这类题目是可以用组合数学方法来解决的,可惜淡忘了,也找不到了,看了网上的也有人提到过可以用组合公式解决,可是没人做,都是用了状压DP的方法,这个状压很难讲清楚吧,推荐两篇 第一遍大体看看这个:http://blog.csdn.net/crux_d/article/details/2206736 想要具体实现的时候看看他的解析:http://blog.csdn.net/yan_____/article/details/8719748 #include<iostream> #incl

hdu--1520--树形dp&lt;写起来就是深搜啊&gt;

我肯定还没怎么理解树形dp啊...为什么写下去 就感觉是多了个状态转移方程的深搜呢?或者因为树形dp是依托在树这个数据结构上所进行的 所以是这样的? 这题 被很多人 当做树形dp的入门题 的确.... 如果 u 是 v 的前驱即父母 那么 dp[u][0] += max( dp[v][1] , dp[v][0] ) 0表示u不包括在内 1在内 dp[u[[1] += dp[v][0] 不太难写 还好这个 主要是 每个树形dp都要找出根结点 因为数据很宽松 我直接用了vector来写 1 #inc

BNU 1084 Expected Allowance (dp||母函数||深搜)

题目链接:http://www.bnuoj.com/v3/problem_show.php?pid=1084 题目大意:给你n个骰子,每个骰子有m个面,点数分别为(1-m),现在同时摇这n个骰子,(得到的点数和)-k  即为小明得到的钱数,当然小明每次最少会得到一元(即最后结果小于等于1时),问小明得到钱数的期望值. 解题思路:由于此题m*n较小,故按照普通的期望计算就行,即   摇到某个点数(i)的概率p*摇到的点数(i),其中显然(n=<  i  <=n*m)除以总的情况数(m的n次方)(

hdu 5311 Hidden String dp o(n)算法 深搜

Hidden String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 857    Accepted Submission(s): 322 Problem Description Today is the 1st anniversary of BestCoder. Soda, the contest manager, gets

方格取数(多线程dp,深搜)

https://www.luogu.org/problem/P1004 题目描述 设有N×N的方格图(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样例): 某人从图的左上角的A点出发,可以向下行走,也可以向右走,直到到达右下角的B点.在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0).此人从A点到B点共走两次,试找出2条这样的路径,使得取得的数之和为最大. 输入格式 输入的第一行为一个整数N(表示N×N的方格图),接下来的每行有三个整数,前

POJ_1088 滑雪(记忆型DP+DFS)

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 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.在上面的例子

NYOJ 10 skiing (深搜和动归)

skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 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