bzoj 3824: [Usaco2014 Dec]Guard Mark状压dp
Posted lokiii
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 3824: [Usaco2014 Dec]Guard Mark状压dp相关的知识,希望对你有一定的参考价值。
设f[s]为已经从上到下叠了状态为s的牛的最大稳定度,转移的话枚举没有在集合里并且强壮度>=当前集合牛重量和的用min(f[s],当前放进去的牛还能承受多种)来更新,高度的话直接看是否有合法集合的高度达到要求即可
#include<iostream>
#include<cstdio>
using namespace std;
const int N=25;
int n,m,h[N],w[N],a[N],f[2000005],ans=-1;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&h[i],&w[i],&a[i]);
for(int i=0,len=(1<<n)-1;i<=len;i++)
f[i]=-1;
f[0]=1e9;
for(int s=0,len=(1<<n)-1;s<=len;s++)
if(f[s]!=-1)
{
int we=0,he=0;
for(int i=1;i<=n;i++)
if(s&(1<<(i-1)))
we+=w[i],he+=h[i];//cerr<<s<<" "<<f[s]<<" "<<we<<" "<<he<<endl;
if(he>=m)
ans=max(ans,f[s]);
for(int i=1;i<=n;i++)
if(!(s&(1<<(i-1)))&&a[i]>=we)
f[s|(1<<(i-1))]=max(f[s|(1<<(i-1))],min(f[s],a[i]-we));
}
if(ans==-1)
puts("Mark is too tall");
else
printf("%d
",ans);
return 0;
}
以上是关于bzoj 3824: [Usaco2014 Dec]Guard Mark状压dp的主要内容,如果未能解决你的问题,请参考以下文章
bzoj3893[Usaco2014 Dec]Cow Jog*
bzoj3891[Usaco2014 Dec]Piggy Back*
Bzoj3893 [Usaco2014 Dec]Cow Jog
[bzoj3892] [Usaco2014 Dec]Marathon