Skip to content

T01661: Help Jimmy

dfs/dp, http://cs101.openjudge.cn/practice/01661 做了4-5h才完全搞明白这道题...... 一开始忘记考虑y - p[i].h > MaxVal时的返回值了,导致返回的是默认值0,在这里卡了很久,也就是说它作为一个单纯的DFS题就已经不是很容易了,结果写完以后发现超时了,做了剪枝之后发现还是超时,然后就借助ai得知了记忆化搜索这个工具,然后又在key上面卡了好久,最后还是写出来了。

cpp
#include <iostream>  
#include <algorithm>  
#include <vector>  
#include <unordered_map>  
using namespace std;  

int minTime, MaxVal;  
 
struct Node  
{  
    int r, l, h;  
};  
 
bool cmp(Node a, Node b)  
{  
    return a.h > b.h;  
}  
 
unordered_map<long long, int> memo;  

long long encode(int x, int y, int it)  
{  
    return ((long long)x << 32) | ((long long)y << 16) | it;  
}  

int dfs(vector<Node>& p, int x, int y, int it)  
{  
    long long key = encode(x, y, it);  
    if (memo.count(key))  
        return memo[key];  
    for (int i = it + 1; i < p.size(); i++)  
    {  
        if (y - p[i].h > MaxVal)  
            return memo[key] = 1e9;  
        else if (x >= p[i].l && x <= p[i].r)  
        {  
            int l = x - p[i].l + dfs(p, p[i].l, p[i].h, i);  
            int r = p[i].r - x + dfs(p, p[i].r, p[i].h, i);  
            return memo[key] = l < r ? l : r;  
        }  
    }  
    return memo[key] = 0;  
}  

int main()  
{  
    ios::sync_with_stdio(false);  
    cin.tie(nullptr);  

    int k;  
    cin >> k;  
    while (k--)  
    {  
        int n, inix, iniy;  
        cin >> n >> inix >> iniy >> MaxVal;  
        vector<Node> plat;  
        Node floor;  
        floor.l = inix, floor.r = inix, floor.h = iniy;  
        plat.push_back(floor);  
        while (n--)  
        {  
            Node ipt;  
            cin >> ipt.l >> ipt.r >> ipt.h;  
            plat.push_back(ipt);  
        }  
        sort(plat.begin(), plat.end(), cmp);  
        cout << iniy + dfs(plat, inix, iniy, 0) << '\n';  
    }  
    return 0;  
}