题目链接:
题目大意:
题解:
状压dp
f[i]表示已经选了i的奶牛来叠的最大安全因子为多少。
因为已经知道选了什么,所以高度是一定的(用了sm[i]来存)
对于每个sm[i]≥L,ans=max(ans,f[i])。选个最大值~
小吐槽:神tm一开始以为要用long long,然后I64d交bzoj交了好几次!显示WA!让我还以为USACO的数据水到了这种地步..改成int之后快了两秒!两秒啊!还能说什么!
#include#include #include #include using namespace std;// typedef long long LL;#define maxn 1100000#define N 30const int inf = 1e9;int f[maxn],sm[maxn];int h[N],w[N],s[N];int mymax(int x,int y){return (x>y)?x:y;}int mymin(int x,int y){return (x f[i]) continue; f[xx]=mymax(f[xx],mymin(s[k],f[i]-w[k])); sm[xx]=sm[i]+h[k]; } if (sm[i]>=L && f[i]!=inf) ans=mymax(ans,f[i]); } if (ans==-1) printf("Mark is too tall\n"); else printf("%d\n",ans); return 0;}