poj1661helpjimmy(记忆化搜索)

Gealo Gealo     2022-08-15     273

关键词:

题目链接:http://poj.org/problem?id=1661

一道还可以的记忆化搜索题,主要是要想到如何设dp,记忆化搜索是避免递归过程中的重复求值,所以要得到dp必须知道如何递归

由于这是个可以左右移动的所以递归过程肯定设计左右所以dp的一维为从左边下或者从右边下,而且和层数有关所以另一维为层数

于是便可以得到dp[count][flag],flag=1表示count层从左边下要多久,flag=0表示count层从右边下要多久。然后就是dfs的递归

过程

 

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int M = 2e4 + 10 , MM = 6e4 + 10;
int n , x , y , MAX;
int dp[1010][2];
struct TnT {
    int sta , ed , h;
}s[1010];
bool cmp(TnT a , TnT b) {
    return a.h > b.h;
}
int dfs(int count , int flag) {
    if(count == n) {
        return 0;
    }
    int ans = MM;
    if(dp[count][flag] != -1) {
        return dp[count][flag];
    }
    int temp = count;
    for(int i = count + 1 ; i <= n ; i++) {
        temp = i;
        if(s[count].h - s[i].h <= MAX) {
            if(flag == 1) {
                if(s[count].ed <= s[i].ed && s[count].ed >= s[i].sta) {
                    ans = min(dfs(i , flag) + s[i].ed - s[count].ed , dfs(i , 1 - flag) + s[count].ed - s[i].sta);
                    break;
                }
            }
            if(flag == 0) {
                if(s[count].sta <= s[i].ed && s[count].sta >= s[i].sta) {
                    ans = min(dfs(i , flag) + s[count].sta - s[i].sta , dfs(i , 1 - flag) + s[i].ed - s[count].sta);
                    break;
                }
            }
        }
        else {
            break;
        }
    }
    if(ans == MM) {
        if(temp == n) {
            if(s[count].h > MAX) {
                dp[count][flag] = ans;
                return ans;
            }
            else {
                ans = 0;
                dp[count][flag] = ans;
                return ans;
            }
        }
        dp[count][flag] = ans;
        return ans;
    }
    else {
        dp[count][flag] = ans;
        return ans;
    }
}
int main() {
    int t;
    scanf("%d" , &t);
    while(t--) {
        scanf("%d%d%d%d" , &n , &x , &y , &MAX);
        for(int i = 1 ; i <= n ; i++) {
            scanf("%d%d%d" , &s[i].sta , &s[i].ed , &s[i].h);
        }
        sort(s + 1 , s + n + 1 , cmp);
        s[0].sta = s[0].ed = x , s[0].h = y;
        s[n + 1].sta = -M , s[n + 1].ed = M , s[n + 1].h = 0;
        memset(dp , -1 , sizeof(dp));
        int gg = dfs(0 , 0);
        gg = min(dfs(0 , 1) , gg);
        printf("%d
" , gg + y);
    }
    return 0;
}

poj1661helpjimmy

传送门:http://poj.org/problem?id=1661解题思路:其实吧,不难就是细节有点麻烦。实现代码:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;constintMAXN=20005;constintIN 查看详情

poj1661(helpjimmy)(代码片段)

HelpJimmyTimeLimit: 1000MS MemoryLimit: 10000KTotalSubmissions: 13669 Accepted: 4541Description"HelpJimmy"是在下图所示的场景上完成的游戏。 场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度... 查看详情

poj1661helpjimmy(二维dp)

题目链接:http://poj.org/problem?id=1661题目大意:如图包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。Jimmy老鼠在时刻0从高于所有平台的某处(高H处)开始下落,它的下落速度始终为1米/秒。当Jimmy... 查看详情

动规-poj-1661

http://poj.org/problem?id=1661HelpJimmy在同一竖直平面上,存在地面(高度为0,长度无限),以及若干个给定高度的水平平台(高度、左右端点给定)。现有Jimmy从给定点(x,y)跳下,下落的速度恒为1单位距离/单位时间。但下落的距离不... 查看详情

poj1661

题意HelpJimmy"是在下图所示的场景上完成的游戏。 场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。 Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当... 查看详情

poj2111milleniumleapcow(记忆化搜索)

DescriptionThecowshaverevisedtheirgameofleapcow.TheynowplayinthemiddleofahugepastureuponwhichtheyhavemarkedagridthatbearsaremarkableresemblancetoachessboardofNrowsandNcolumns(3<=N<=365). He 查看详情

poj1390blocks(记忆化搜索)

BlocksTimeLimit: 5000MS MemoryLimit: 65536KTotalSubmissions: 4318 Accepted: 1745DescriptionSomeofyoumayhaveplayedagamecalled‘Blocks‘.Therearenblocksinarow,eachboxhasacolo 查看详情

poj1661(kb12-mdp)

HelpJimmyDescription"HelpJimmy"是在下图所示的场景上完成的游戏。 场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。 Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终... 查看详情

poj1351numberoflocks(记忆化搜索)

题目链接:传送门思路:这道题是维基百科上面的记忆化搜索的例题。。。四维状态dp[maxn][5][2][5]分别表示第几根棒子,这根棒子的高度,是否达到题目的要求和使用不同棒子数。那么接下来就是状态转移了。。。要用到位运算... 查看详情

poj1179区间dp(记忆化搜索写法)有巨坑!

http://poj.org/problem?id=1179DescriptionPolygonisagameforoneplayerthatstartsonapolygonwithNvertices,liketheoneinFigure1,whereN=4.Eachvertexislabelledwithanintegerandeachedgeislabelledwitheitherthesym 查看详情

记忆化搜索||poj1088滑雪

...数那里走,问最远长度是多少*解法:每一点dfs搜索一遍记忆化搜索:http://blog.csdn.net/acmer_sly/article/details/53440798递归:求解的方法都是相同的(距离是周围的点最大值加一),假设已知周围点的距离则dd[i]=dfs(xx,yy)+1; 每一次递... 查看详情

poj1579functionrunfun记忆化搜索入门(代码片段)

题目传送门:http://poj.org/problem?id=1579FunctionRunFunTimeLimit: 1000MS MemoryLimit: 10000KTotalSubmissions: 20560 Accepted: 10325DescriptionWeallloverecursion!Don‘twe?  查看详情

poj1088滑雪(记忆化搜索)

滑雪TimeLimit: 1000MS MemoryLimit: 65536KTotalSubmissions: 92384 Accepted: 34948DescriptionMichael喜欢滑雪百这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次... 查看详情

poj1191棋盘切割(压缩dp+记忆化搜索)

一,题意:中文题二。分析:主要利用压缩dp与记忆化搜索思想三,代码:#include<iostream>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>usingnamespacestd;constintBig=20000000;intMat[10] 查看详情

poj1088滑雪记忆化搜索

解析:状态d[i][j]代表r=i,c=j这个位置能滑的最大长度。深搜+备忘录#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;constintmaxn=100+5;intR,C;inta[maxn][maxn];intd[m 查看详情

poj2704pascal'stravelsdfs记忆化搜索(代码片段)

题目传送门:http://poj.org/problem?id=2704Pascal‘sTravelsTimeLimit: 1000MS MemoryLimit: 65536KTotalSubmissions: 5535 Accepted: 2500DescriptionAnnxngameboardispopulatedwithinteg 查看详情

poj_1088_(dp)(记忆化搜索)

滑雪TimeLimit: 1000MS MemoryLimit: 65536KTotalSubmissions: 95792 Accepted: 36322DescriptionMichael喜欢滑雪百这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次... 查看详情

poj1088:滑雪(经典dp+记忆化搜索)

滑雪TimeLimit: 1000MS MemoryLimit: 65536KTotalSubmissions: 74996 Accepted: 27818DescriptionMichael喜欢滑雪百这并不奇怪,由于滑雪的确非常刺激。但是为了获得速度,滑的区域必须向下倾斜,并且当你滑到坡底,你不得不再... 查看详情