【BZOJ1226】学校食堂Dining(状压DP)

题意:见题面

思路:设dp[i,sta,k]为前i个人已经吃完,从第i人到第i+b[i]人的吃饭状况是sta,前一个吃完的人离i的距离是k(可能为负)的最小值

\[ dp[i+1,sta>>1,k-1]=min(dp[i+1,sta>>1,k-1],dp[i,sta,k]) (sta and 1=1,如果i已经吃完)\]

\[dp[i,sta+1<<l,l]=min(dp[i,sta+1<<l,l],dp[i,sta,k]+w(i+k,i+l) (第i+l人吃,前一个吃的人是i+k)\]

\[w(i,j)=b[i]  or  b[j]-b[i]  and  b[j]=b[i]  xor  b[j]\]

注意转移的时候边界判断,是否超过l人里面最小的容忍范围

 1 const oo=2000000000;
 2 var dp:array[1..1100,0..300,-8..8]of longint;
 3     t,b:array[1..1100]of longint;
 4     cas,v,n,i,j,k,l,ans,r:longint;
 5
 6 function clac(x,y:longint):longint;
 7 begin
 8  if x=0 then exit(0);
 9  exit(t[x] xor t[y]);
10 end;
11
12 function min(x,y:longint):longint;
13 begin
14  if x<y then exit(x);
15  exit(y);
16 end;
17
18 begin
19  assign(input,‘bzoj1226.in‘); reset(input);
20  assign(output,‘bzoj1226.out‘); rewrite(output);
21  readln(cas);
22  for v:=1 to cas do
23  begin
24   read(n);
25   for i:=1 to n do read(t[i],b[i]);
26   fillchar(dp,sizeof(dp),$7f);
27   dp[1,0,-1]:=0;
28   for i:=1 to n do
29    for j:=0 to (1<<8)-1 do
30     for k:=-8 to 7 do
31      if dp[i,j,k]<oo then
32      begin
33       if j and 1>0 then
34        dp[i+1,j>>1,k-1]:=min(dp[i+1,j>>1,k-1],dp[i,j,k])
35         else
36         begin
37          r:=oo;
38          for l:=0 to 7 do
39           if j and (1<<l)=0 then
40           begin
41            if i+l>r then break;
42            r:=min(r,i+b[i+l]+l);
43            dp[i,j+(1<<l),l]:=min(dp[i,j+(1<<l),l],dp[i,j,k]+clac(i+k,i+l));
44           end;
45         end;
46      end;
47   ans:=oo;
48   for i:=-8 to -1 do ans:=min(ans,dp[n+1,0,i]);
49   writeln(ans);
50  end;
51  close(input);
52  close(output);
53 end.
时间: 2024-10-18 10:40:54

【BZOJ1226】学校食堂Dining(状压DP)的相关文章

【BZOJ1226】[SDOI2009]学校食堂Dining 状压DP

[BZOJ1226][SDOI2009]学校食堂Dining Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数表示.由于人手不够,食堂每次只能为一个人做菜.做每道菜所需的时间是和前一道菜有关的,若前一道菜的对应的口味是a,这一道为b,则做这道菜所需的时间为(a or b)-(a and b),而做第一道菜是不需要计算时间的.其中,o

bzoj1226: [SDOI2009]学校食堂Dining 状压dp

Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数表示.由于人手不够,食堂每次只能为一个人做菜.做每道菜所需的时间是和前一道菜有关的,若前一道菜的对应的口味是a,这一道为b,则做这道菜所需的时间为(a or b)-(a and b),而做第一道菜是不需要计算时间的.其中,or 和and 表示整数逐位或运算及逐位与运算,C语言中对应的运

[LuoguP2157][SDOI2009]学校食堂_状压dp

学校食堂 题目链接:https://www.luogu.org/problem/P2157 数据范围:略. 题解: 发现$B$特别小,很容易想到状压. 即在$dp$的时候弄出来$f_{(i,j,k)}$表示前$i - 1$个都打完了饭,状态$j$也已经打完饭了,当前打饭的是$i$,上一个打饭的是$i+k$这样能存的下. 转移的话需要枚举状态,但是没必要枚举完全因为毕竟是长度只有$7$. 看见了相邻两个人转移的代价之后,以为可以根据位运算能搞出点什么东西发现啥也搞不动. 我们可以适当地省略一些条件

bzoj 1226 [SDOI2009]学校食堂Dining(状压DP)

Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数表示.由于人手不够,食堂每次只能为一个人做菜.做每道菜所需的时间是和前一道菜有关的,若前一道菜的对应的口味是a,这一道为b,则做这道菜所需的时间为(a or b)-(a and b),而做第一道菜是不需要计算时间的.其中,or 和and 表示整数逐位或运算及逐位与运算,C语言中对应的运

【vijos】1286 座位安排(状压dp)

https://vijos.org/p/1286 这题好神不会捉... 首先我们知道所有情况有C(n*m, k)种,这个好搞.但是两两不相邻这个有点难搞.. 原来是状压dp..sigh. 设状态f[i][j][k]表示第i行放置的摆放状态是j放了k个人的方案,那么有 f[i][j][k]=sum{f[i-1][x][k-num[x]]},当j的人两两不冲突,且j和x的人两两不冲突,num[x]是x状态的人的数量 最后不冲突的数目是sum{f[n][j][k]},k是题目所给的,j是所有的状态 显

[luoguP3694] 邦邦的大合唱站队/签到题(状压DP)

传送门 来自kkk的题解: 70分做法:枚举每个学校顺序,暴力. 100分:状压dp.从队列头到尾DP, 状态:f[i]表示i状态下最小的出列(不一致)的个数. 比如f[1101]表示从头到位为1/3/4乐队的偶像的最小出列个数. f[i]=min(f[i\ xor\ 2^j]+num[j]-(sum[length][j]-sum[length-num[j]][j]));f[i]=min(f[i xor 2?j??]+num[j]−(sum[length][j]−sum[length−num[j

状压DP UVA 10817 Headmaster&#39;s Headache

题目传送门 1 /* 2 题意:学校有在任的老师和应聘的老师,选择一些应聘老师,使得每门科目至少两个老师教,问最少花费多少 3 状压DP:一看到数据那么小,肯定是状压了.这个状态不好想,dp[s1][s2]表示s1二进制表示下至少有1位老师的科目集合 4 s2表示至少有2位老师的科目集合所花费的最小金额,状态转移方程(01):dp[t1][t2]=min(dp[t1][t2],dp[j][k]+c[i]); 5 j,k为当前两个集合,t1,t2为转移后的集合,另外求t1,t2用到了& |位运算

[tyvj2054] 四叶草魔杖 (最小生成树 状压dp)

传送门 Background 陶醉在彩虹光芒笼罩的美景之中,探险队员们不知不觉已经穿过了七色虹,到达了目的地,面前出现了一座城堡和小溪田园,城堡前的木牌上写着"Poetic Island". "这一定就是另外两位护法的所在地了--我们快进去吧!" 探险队员们快步进入了城堡,城堡大厅的羊毛沙发上坐着两个人. "你们是Nescafe的护法吧?" "是的哦~ 我们就是圣剑护法rainbow和魔杖护法freda~ 你们来这里做什么呢~"

ZOJ3305Get Sauce 状压DP,

状压DP的题目留个纪念,首先题意一开始读错了,搞了好久,然后弄好了,觉得DFS可以,最后超时,修改了很久还是超时,没办法看了一下n的范围,然后觉得状压可以,但是没有直接推出来,就记忆化搜索了一下,可是一直错,莫名奇妙,然后没办法看了一下题解,发现了下面这个比较好的方法,然后按照这个方程去推,然后敲,也是WA了好多把,写的太搓了,没人家的清楚明了,唉~也算是给自己留个纪念,状压一直做的都不太好~唉~还好理解了, 参考了  http://blog.csdn.net/nash142857/articl

poj 2411 Mondriaan&#39;s Dream(状压DP)

Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 12232   Accepted: 7142 Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series