P3360 偷天换日

Posted mysh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P3360 偷天换日相关的知识,希望对你有一定的参考价值。

题目背景

神偷对艺术馆内的名画垂涎欲滴准备大捞一把。
题目描述

艺术馆由若干个展览厅和若干条走廊组成。每一条走廊的尽头不是通向一个展览厅,就

是分为两个走廊。每个展览厅内都有若干幅画,每副画都有一个价值。经过走廊和偷画都是

要耗费时间的。

警察会在n 秒后到达进口,在不被逮捕的情况下你最多能得到的价值。

输入格式

第一行一个整数 n(n≤600)。

第二行若干组整数,对于每组整数(t,x),t 表示进入这个展览厅或经过走廊要耗费 t

秒的时间,若x>0 表示走廊通向的展览厅内有x 幅画,接下来

x对整数(w,c)表示偷一幅价值为 w 的画需要 c秒的时间。若

x=0 表示走廊一分为二。(t,c≤5; x≤30)

输入是按深度优先给出的。房间和走廊数不超过 300 个。

技术图片

输出格式

仅一个整数,表示能获得的最大价值。

输入

50 
5 0 10 1 10 1 5 0 10 2 500 1 1000 2 18 1 1000000 4

输出

1500

思路:

对于dp,可以直接在读入中做。

还有这道题有两个坑点,一是小偷在s-1秒时就必须离开

二是走廊必须走一来一回两遍

所以做dfs前s--,做背包时前t*2

背包容量下限加一个时间t(*2)

然后就和选课一样,最多时间s(-1),最少t(*2)

从左节点下限一秒也不花,上限走这条走廊的时间i-t(*2),我们有公式
dp[x][i]=max(dp[x][i],dp[x<<1][j]+dp[x<<1|1][i-j-t]);

x为当前节点,i为走该走廊的时间

左儿子花j秒,右儿子花i-j-t(2)秒,走走廊t(2)秒(t是读入时的t,可以在dp前就t*2

下面给出代码

代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N=2010;

int s,ans;
int a[N],b[N];
int f[N*5][N*5];

void read(int x) 
	int t,k;
	scanf("%d%d",&t,&k);
	t=t<<1;
	if(k>0) 
		for(int i=1; i<=k; i++)
			scanf("%d%d",&a[i],&b[i]);
		for(int i=1; i<=k; i++)
			for(int j=s; j>=t+b[i]; j--)
				f[x][j]=max(f[x][j-b[i]]+a[i],f[x][j]);
	
	if(!k) 
		read(x<<1);
		read(x<<1|1);
		for(int i=s; i>=t; i--)
			for(int j=0; j<=i-t; j++)
				f[x][i]=max(f[x][i],f[x<<1][j]+f[x<<1|1][i-j-t]);
	


int main () 
	scanf("%d",&s);
	s--;
	read(1);
	printf("%d\n",f[1][s]);
	return 0;

  

以上是关于P3360 偷天换日的主要内容,如果未能解决你的问题,请参考以下文章

偷天换日,用 JavaAgent 欺骗你的 JVM

骚操作 | 不重启 JVM,替换掉已经加载的类,偷天换日?

换日栏的哪个 UI 元素?

什么是method swizzling(俗称黑魔法)

不需要 Root,也能用上强大的 Xposed 框架:VirtualXposed

不需要 Root,这个方法教你用上 Android 最强大的 Xposed 框架