您的位置:首页 > 其它

洛谷 P1270 访问美术馆

2018-02-25 15:47 176 查看
洛谷 P1270 访问美术馆

题目分析

应该也可以说成是一道树依赖背包的问题吧。本题的dp方程还是很好想的

dp[i][j]=max(dp[i][j],dp[lch][k]+dp[rch][j-k]) dp[i][j]表示到第i条走廊剩余j的时间最多能拿的画的数量

主要的是这道题有个很神奇的输入,本蒟第一次看到,便是便搜索的时候便输入(按照深度有限的搜索顺序搜索)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int tot;
int dp[1010][1010];
struct arr{
int cost,val;
}t[1010];
template<class T>void ChkMax(T &a,T b){if (a<b)a=b;}
inline int read(){
int x=0,w=1;char ch;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch-48),ch=getchar();
return x*w;
}
void init(int x){
t[x].cost=read();t[x].val=read();
t[x].cost*=2;
if(!t[x].val){init(x<<1);init(x<<1|1);}
}
int dfs(int x,int tt){//dp[i][j]表示到第i条走廊剩余j的时间最多能拿的画的数量。
if (dp[x][tt]>0 || !tt) return dp[x][tt];
if (t[x].val) return dp[x][tt]=min(t[x].val,(tt-t[x].cost)/5);
//取min的原因是不能超过剩余时间
for(register int k=0;k<=tt-t[x].cost;++k)
dp[x][tt]=max(dp[x][tt],dfs(x<<1,k)+dfs(x<<1|1,tt-t[x].cost-k));
return dp[x][tt];
}
int main(){
freopen("P1270.in","r",stdin);
freopen("P1270.out","w",stdout);
tot=read()-1;
init(1);
printf("%d",dfs(1,tot));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: