“访问”美术馆

版权声明:转载者乖乖♂站好 https://blog.csdn.net/Eric1561759334/article/details/83540117

题目

https://www.luogu.org/problemnew/show/P1270

思路

首先处理读入,以dfs的形式输入

dp[i][j]表示到第i条走廊剩余j的时间最多能拿的画的数量。

那么枚举一下分给左儿子的时间k,那么分给右儿子的就是j-k了。

所以dp[i][j]=max(dp[i][j],dp[lch][k]+dp[rch][j-k])

当然,还要减去一个经过走廊的时间。注意,走廊是要走过去并且走回来的,所以时间在读入时*2就行了。

题目还有一个坑,就是警察一到小偷就死,所以小偷必须在警察来的前1秒跑掉

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1077;
int dp[maxn][maxn],tt;
struct T
{
	int t,val;
}t[maxn*10];
void init(int u)
{
	scanf("%d%d",&t[u].t,&t[u].val); t[u].t*=2;
	if(!t[u].val) init(u*2),init(u*2+1);
}
int dfs(int u,int time)
{
	if(dp[u][time]>0||!time)return dp[u][time];
    if(t[u].val) return dp[u][time]=min(t[u].val,(time-t[u].t)/5);
    for(int k=0; k<=time-t[u].t;k++)
        dp[u][time]=max(dp[u][time],dfs(u<<1,k)+dfs(u<<1|1,time-t[u].t-k));
    return dp[u][time];
}
int main()
{
	scanf("%d",&tt); tt--;
	init(1);
	printf("%d",dfs(1,tt));
}

猜你喜欢

转载自blog.csdn.net/Eric1561759334/article/details/83540117
今日推荐