首页 > 其他分享 >【题解】Luogu[P3360] 偷天换日

【题解】Luogu[P3360] 偷天换日

时间:2023-07-20 12:22:47浏览次数:39  
标签:int 题解 dfs times 花费 偷天换日 走廊 我们 P3360

solution

开题显然是个树形 dp,只不过在树形 dp 上又增加了背包问题。

我们不妨将每个走廊看成一个点,把交叉口看成边(当然也可以把交叉口看成点,不过写起来麻烦一些),于是就转化为了一棵二叉树。

我们设 \(f_{i,j}\) 表示以 \(i\) 为根的子树内,花费了不超过 \(j\) 时间,能拿到的最大价值。

考虑转移,发现输入是按深度给的,我们不妨一边 dfs 一边输入一边做转移。

对于当前节点(走廊) \(x\),我们两种情况分别讨论:

  1. 走廊的尽头是展览厅。
  2. 走廊的尽头是分叉口。

对于第一种,这里是一个显然的 01 背包问题,每幅画可以选择拿或不拿,代价为偷画的时间 \(c\),价值为画的价值 \(w\),即 \(f_{x,j}=\max(f_{x,j}, f_{x,j-c} + w)\),但是注意我们还需要付出走这条走廊的时间 \(t\),于是枚举 \(j\) 的时候注意要大于等于 \(t+c\)

对于第二种,我们不妨借鉴一下线段树的建树思想,令节点 \(i\) 的左儿子为 \(i\times 2\) 右儿子为 \(i\times 2 + 1\),我们枚举以 \(x\) 为根的子树内所花费的时间 \(i\),再枚举走左儿子最大花费的时间 \(j\),那么显然走右儿子最大花费时间能轻易算出来,为 \(i-j\) 吗?错,注意还需要花费时间走 \(x\) 这条走廊,故为 \(i-t-j\)。那么显然 \(f_{x,i} = \max(f_{x,i}, f_{x\times 2,j}+f_{x\times 2 + 1, i - t - j})\)

最后答案即为 \(f_{1,n}\)

坑点

  1. 注意每一条走廊我们不光需要走进去,还需要走出来回到出口,于是实际上每一条走廊需要走两遍,我们在输入的时候将该走廊需要花费的时间 \(\times 2\) 即可。
  2. 注意题目说警察会在 \(n\) 秒后到达出口,如果我们也在 \(n\) 秒后到达出口,显然会被警察抓住,于是我们需要在 \(n - 1\) 秒后到达出口,我们一开始将 \(n\) 减去 \(1\) 即可。

code

#include <bits/stdc++.h>
using namespace std;
int n, f[305][605], w[605], c[605];
void dfs(int x) {
    int t, m;
    cin >> t >> m, t *= 2;
    if(m) {
        for(int i = 1; i <= m; ++i)
            cin >> w[i] >> c[i];
        for(int i = 1; i <= m; ++i)
            for(int j = n; j >= t + c[i]; --j)
                f[x][j] = max(f[x][j - c[i]] + w[i], f[x][j]);
    } else {
        dfs(x * 2), dfs(x * 2 + 1);
        for(int i = t; i <= n; ++i)
            for(int j = 0; j <= i - t; ++j)
                f[x][i] = max(f[x][i], f[x * 2][j] + f[x * 2 + 1][i - t - j]);
    }
}
int main() {
    cin >> n, --n, dfs(1), cout << f[1][n] << endl;
    return 0;
}

标签:int,题解,dfs,times,花费,偷天换日,走廊,我们,P3360
From: https://www.cnblogs.com/agrumestly/p/17567976.html

相关文章

  • Frog 3 题解
    Frog3题目大意题意都这么明确了还要这个干什么。存在\(n\)个点,每个点有一个属性\(h_i\),\(h_i\)单增,从点\(i\)移动到点\(j(j>i)\)的代价是\((h_i-h_j)^2+C\),其中\(C\)是给定的常数,求从点\(1\)移动到点\(n\)的最小代价。思路分析斜率优化DP板题。设\(f_i\)......
  • SP10582 题解
    题目链接题意简述给定一个有\(n\)个数的数组,求从第一个数字开始,向后每\(k\)个数字的最大值。题目分析看到没有人用ST表做那我就来发一个吧。这道题可以用ST表做。它可以在经过\(O(N\logN)\)的预处理后,以\(O(1)\)的时间在线回答下标在\(l\)到\(r\)之间的数......
  • 【题解】Luogu[P2607] [ZJOI2008] 骑士
    题目说给定\(n\)个点\(n\)个关系,也就是\(n\)条边,显然是基环树,又因为没有规定一定连通,于是我们可以将题目简化为给定一个基环树森林,点有点权,相邻的两个点不能同时选,问最大点权和。part1我们先考虑如果没有环,只是树,该怎么做。这一部分很简单,令\(f_{i,0/1}\)表示以\(i\)......
  • 基站建设 题解
    基站建设题目大意在平面上存在\(n\)个点,第\(i\)个点的坐标为\((x_i,0)\),具有一个发射半径\(r_i\)和一个费用\(v_i\)。连接具有方向性,当且仅当\(j<i\)且点\(i\)的接收范围与点\(j\)的发射范围相切时点\(i\)才能连接到点\(j\)。第\(i\)个点的发射范围是指一......
  • [ARC104E] Random LIS 题解
    [ARC104E]RandomLIS题解Link吐了,一下午就写了这一个题……主要是题解都说的很草率。然后上课的时候貌似讲的方法不是很能做(也许是我太菜了),总之我得写篇题解整理整理。首先\(n\)很小,可以直接爆搜所有相对大小,即我们去搜索\(1\)到\(n\)的排名,排名可以一样(即\(a_i\)相......
  • RTSP流媒体服务器LntonNVR(源码版)云服务平台下载录像后无法拖动时间轴的问题解决方案
    LntonNVR安防视频云服务平台是基于RTSP/Onvif协议的视频接入、处理及分发平台,可以分发出RTSP、RTMP、WS-FLV、HTTP-FLV、HLS、WebRTC等格式的视频流,可实现在全终端(PC、手机、平板、电子大屏/电视墙等)播放监控视频。有用户反馈,在使用LntonNVR下载录像时,下载后的录像时间无法拖动时间......
  • 【小学期实训】附加题题解——Good Karma
    [状压dp+容斥原理]实训附加题——GoodKarma目录[状压dp+容斥原理]实训附加题——GoodKarma题目描述题目输入格式输出格式数据范围样例输入1样例输出1样例输入2样例输出2样例解释2Solution题目描述题目链接题目「天空度假山庄」中有一个\(n\)点\(m\)边的无向图,图中点......
  • 【小学期实训】附加题题解——最高段位
    [dp状态设计]实训附加题——最高段位目录[dp状态设计]实训附加题——最高段位题目描述背景题目输入格式输出格式数据范围样例输入1样例输出1样例输入2样例输出2样例解释2样例输入3样例输出3Solution题目描述题目链接背景香风智乃除了喜欢玩瓶中船之外,还喜欢打竞技游戏。有......
  • CF786E ALT 题解
    为什么你们第一眼都能想到最小割,我第一眼都只能想到费用流。为什么你们的做法都这么短,我一写就是\(5KB\)。费用流有一个基本矛盾,就是守卫只需拥有一只狗和每一个人都需要守卫有狗的基本矛盾。由于需求与供给不平衡,所以流量不好确定。如果有人费用流过了来长沙火车站,疯狂星期四......
  • [SDOI2010] 代码拍卖会 题解
    [SDOI2010]代码拍卖会题解题目描述一个\(n,n\le10^{18}\)位数,仅由\(1\sim9\)组成,后一位数字一定大于等于前一位数字。求这些数中可以被\(m,m\le500\)整除的有多少,对\(999911659\)取模。解析这个数一定形如\(112334455677788999\)可以把它拆成\[\begin{aligned}......