bzoj1226 [SDOI2009]学校食堂Dining 状压DP
2017-10-29 22:13
417 查看
题意:一个学生序列,每一个人有一个想吃的菜t和忍受程度x,如果先让紧跟他后面的人吃,不能超过x个,问最小的进餐时间。如果先做j,在做k,时间是(t[j]|t[k])-(t[j]&t[k])
= =一开始没看见那个紧跟,导致我写了个n^3*7的算法结果T了,想了老长时间不知道该咋做,然后瞄了一波题解,发现看错题目了。。
这种题目套路啊,,一看贡献跟相邻的有关就要设一个结尾的状态,那么明显有:
f[i][j][k]表示做到第i个人,他屁股后的7个人状态为j,01表示是否吃,k表示上一个结尾和现在的距离。
那么j状态把当前位置也表示上,便于处理,然后当j&1时,说明i已经吃了。
那么有f[i+1][j>>1][k−1]=min(f[i][j][k])
否则,我枚举在后面的7位里面到底有哪些人吃了,一一计算贡献。
f[i][j|(1<<l)][l]=min(f[i][j][k]+t[i+k]|t[i+l]-t[i+k]&t[i+k])
注意优先级,我这里就懒得写括号了,时刻记得位运算的优先级最低。
然后WA了个爽,最后发现C++的数组不能为负数,那么+个10就好。
= =一开始没看见那个紧跟,导致我写了个n^3*7的算法结果T了,想了老长时间不知道该咋做,然后瞄了一波题解,发现看错题目了。。
这种题目套路啊,,一看贡献跟相邻的有关就要设一个结尾的状态,那么明显有:
f[i][j][k]表示做到第i个人,他屁股后的7个人状态为j,01表示是否吃,k表示上一个结尾和现在的距离。
那么j状态把当前位置也表示上,便于处理,然后当j&1时,说明i已经吃了。
那么有f[i+1][j>>1][k−1]=min(f[i][j][k])
否则,我枚举在后面的7位里面到底有哪些人吃了,一一计算贡献。
f[i][j|(1<<l)][l]=min(f[i][j][k]+t[i+k]|t[i+l]-t[i+k]&t[i+k])
注意优先级,我这里就懒得写括号了,时刻记得位运算的优先级最低。
然后WA了个爽,最后发现C++的数组不能为负数,那么+个10就好。
#include<cstdio> #include<algorithm> #include<cstring> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=1e3+5; const int MAX=10; int n,m,inf; int f [256][50]; struct node { int t,b; }a ; int main() { int cas; scanf("%d",&cas); while (cas--) { scanf("%d",&n); fo(i,1,n) { scanf("%d%d",&a[i].t,&a[i].b); } memset(f,0x3f,sizeof(f)); inf=f[1][0][-1+MAX]; int tot=1<<8; f[1][0][-1+MAX]=0; fo(i,1,n) { fo(j,0,tot-1) { fo(k,-8,7) if (f[i][j][k+MAX]<inf) { if (j&1) { f[i+1][j>>1][k-1+MAX]=min(f[i+1][j>>1][k-1+MAX],f[i][j][k+MAX]); } else { int r=inf; fo(l,0,7) { if ((j&(1<<l))==0) { if (i+l>r)break; r=min(r,i+l+a[i+l].b); int tmp; if (!(i+k))tmp=0; else tmp=a[i+k].t^a[i+l].t; f[i][j+(1<<l)][l+MAX]=min(f[i][j+(1<<l)][l+MAX],f[i][j][k+MAX]+tmp); } } } } } } int ans=inf; fo(i,-8,-1) { ans=min(ans,f[n+1][0][i+MAX]); } printf("%d\n",ans); } }
相关文章推荐
- BZOJ 1226: [SDOI2009]学校食堂Dining 状压DP
- 【bzoj1226】【[SDOI2009]学校食堂Dining】状压dp
- BZOJ 1226: [SDOI2009]学校食堂Dining [DP 状压]
- bzoj1226 [SDOI2009]学校食堂Dining (状压DP)
- [BZOJ1226][SDOI2009]学校食堂Dining-状压DP
- 【bzoj1226】【[SDOI2009]学校食堂Dining】状压dp
- BZOJ 1226 [SDOI2009]学校食堂Dining ——状压DP
- 【BZOJ1226】[SDOI2009]学校食堂Dining 状压DP
- BZOJ1226 SDOI2009学校食堂(状压dp)
- [BZOJ1226][SDOI2009][状态压缩DP]学校食堂Dining
- [BZOJ1226][SDOI2009]学校食堂(状压DP)
- bzoj 1226: [SDOI2009]学校食堂Dining
- BZOJ1226: [SDOI2009]学校食堂Dining
- BZOJ 1226: [SDOI2009]学校食堂Dining
- [bzoj 1226] [SDOI2009]学校食堂Dining:状态压缩的奥妙
- BZOJ 1226 [SDOI2009] 学校食堂Dining
- BZOJ1226 [SDOI2009]学校食堂Dining 【状压dp】
- 【状压DP】【bzoj 1226】: [SDOI2009]学校食堂Dining
- bzoj 1226 [SDOI2009]学校食堂Dining(状压DP)
- [luoguP2157] [SDOI2009]学校食堂Dining(状压DP)