dfs+dp思想的结合------hdu1078

首先是题目的意思:

从一个正方形的0,0点开始走,只能横着走,竖着走,最多走k步,下一个点的数一定要比当前这个点的值大,每走一步,就加上下一个点的数据,问数据最大能有多少。

首先遇到这种题目,走来走去的,一开始想到的是搜索,但是搜索我们搜的很多是路径,能走到那个点的最短路,但是这道题目不一样。

首先要注意的一点是,如果没有条件的搜索,那就是枚举。只有搜遍了才能得到最后的解。

1s题,只是搜的话肯定TLE了。

所以我们想到的自然就是dp了。dp的好处是什么?就是能减少不必要的搜索。用已知的结果减少当前路径搜索的时间。

几个要点:

1、只能从0,0开始走,所以已经减少了很多复杂了,不要傻乎乎的全部循环。

2、注意dfs时候的边界判断。

3、更新值时不要忘记加上当前自己的值。

状态转移方程

dp[][] = max(所有可以从当前点走到的点的dfs的结果集)

初始值肯定是0没问题

最后dp【0】【0】就是结果了。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>

using namespace std;
/*dfs+dp,hdu1078*/

int maps[105][105];//用来保存原数据
int dp[105][105];//dp数组
int k;//最多走的步数
int n;//区域大小

int update(int x,int y)
{
    int i,j;
    int fromX,toX;
    int fromY,toY;
    int maxTemp=0;
    int temp;

    //判断边界条件
    if(dp[x][y])
        return dp[x][y];

    if(x-k < 0)
        fromX = 0;
    else
        fromX = x-k;

    if(x+k >= n)
        toX = n-1;
    else
        toX = x+k;

    if(y-k < 0)
        fromY = 0;
    else
        fromY = y-k;

    if(y+k >= n)
        toY = n-1;
    else
        toY = y+k;

    for (i = fromX; i <= toX; i++)
    {
        if(i!=x && maps[i][y] > maps[x][y])
        {
            temp = update(i,y);
            if(temp > maxTemp)
                maxTemp = temp;
        }
    }

    for (j = fromY; j <= toY; j++)
    {
        if(j!=y && maps[x][j] > maps[x][y])
        {
            temp = update(x,j);
            if(temp > maxTemp)
                maxTemp = temp;
        }
    }

    dp[x][y] = maxTemp + maps[x][y];
    return dp[x][y];
}

int    main()
{
    int i,j;//循环变量
    int maxNumber=0;//记录结果

    while (true)
    {
        cin>>n>>k;
        if(n==-1 && k==-1)
            break;
        memset(dp,0,sizeof(dp));
        //输入数据
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
                cin>>maps[i][j];

        //只能从0.0点开始走
        maxNumber = update(0,0);

        cout<<maxNumber<<endl;
    }

    return 0;
}
时间: 2025-01-02 04:32:18

dfs+dp思想的结合------hdu1078的相关文章

到底什么是dp思想(内含大量经典例题,附带详细解析)

期末了,通过写博客的方式复习一下dp,把自己理解的dp思想通过样例全部说出来 说说我所理解的dp思想 dp一般用于解决多阶段决策问题,即每个阶段都要做一个决策,全部的决策是一个决策序列,要你求一个 最好的决策序列使得这个问题有最优解 将待求解的问题分为若干个相互联系的子问题,只在第一次遇到的时候求解,然后将这个子问题的答案保存 下来,下次又遇到的时候直接拿过来用即可 dp和分治的不同之处在于分治分解而成的子问题必须没有联系(有联系的话就包含大量重复的子问题,那 么这个问题就不适宜分治,虽然分治也

HDU-4924-Football Manager(DFS+DP)

Problem Description Football Manager is a series of football management simulation games developed by Sports Interactive and published by Sega. In this game, you will play a role of a football club manager and conduct your team to chase championship

hdu 3030 Increasing Speed Limits (离散化+树状数组+DP思想)

Increasing Speed Limits Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 481    Accepted Submission(s): 245 Problem Description You were driving along a highway when you got caught by the road p

记忆化搜索(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

NYOJ 10 skiing DFS+DP

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 一个人可以从

DP思想在斐波那契数列递归求解中的应用

斐波那契数列:1, 1, 2, 3, 5, 8, 13,...,即 f(n) = f(n-1) + f(n-2). 求第n个数的值. 方法一:迭代 public static int iterativeFibonacci(int n) { //简单迭代 int a = 1, b = 1; for(int i = 2; i < n; i ++) { int tmp = a + b; a = b; b = tmp; } return b; } 方法二:简单递归 public static long

[NOIP1999提高] CODEVS 1047 邮票面值设计(dfs+dp)

dfs出邮票的各种面值,然后dp求解. ------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define rep(i,n) for(int i=0;i<n;++i) #define clr(x,c) m

记忆化搜索(搜索+dp思想)

一:简介 (1)记忆化搜索 即 搜索+动态规划数组记录上一层计算结果,避免过多的重复计算 算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存:一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态.更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多. 记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,以后再次遇到这个状态的时候,就不必重新求解了. 这种方法综合了搜索和动态规划两方面的

HDU 1978 记忆化搜索(dfs+dp)

Y - How many ways Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1978 Appoint description: Description 这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m).游戏的规则描述如下: 1.机器人一开始在棋盘的起始点并有起始点所标有的能量. 2.机器