原题传送门:P2157 [SDOI2009]学校食堂

一看题目就知道是状压dp

设f[i][j][k]表示第1到i-1个人都吃完了饭,第i个人以及后面的7个人是否打饭的状态为j,当前最后打饭的人的编号为i+k(-8<=k<=7)

开始设计状态转移方程

当j&1为真,表示i之后的7个人中,不再会有人插队到i之前

可得:f[i + 1][j >> 1][k - 1]=Min(f[i + 1][j >> 1][k -1],f[i][j][k])

当j&1为假,可以选i和后面7个人之一来打饭

枚举h从0到7

可得方程:f[i][j | (1 << h) ][h]=Min(f[i][j | (1 << h) ][h],f[i][j][k] + time(i+k,i+h)

time(i,j)的意义是在第i个人之后给第j个人打饭所需代价

当然,这个转移需要考虑到忍耐度的问题。这样,在i和后面的7个人,不是每一个还未打饭的人都可以先打饭的。

因为编号在他之前的所有未打饭的人的忍耐度必须能忍受这个人在他们之前打饭。

所以,在这里用了一个变量x来统计了一下,表示到目前为止的未打饭的人的忍受范围(注意,不是忍耐度,忍受范围是指能忍受在其之前打饭的最大位置)的最小值

对于任何一个人,如果i+h>x,就表示他无法满足编号在他之前的所有人的忍受范围,就不要考虑这个人了。

状态转移就这么多

最后ans是Min(f[n + 1][0][k]) (-8 <= k <=0 )

#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#define N 1005
#define inf 0x3f3f3f3f
using namespace std;
inline int read()
{
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline int Min(register int a,register int b)
{
return a<b?a:b;
}
int n,T[N],B[N],f[N][1<<8][20];
int main()
{
int t=read();
while(t--)
{
n=read();
for(register int i=1;i<=n;++i)
T[i]=read(),B[i]=read();
memset(f,inf,sizeof(f));
f[1][0][7]=0;
for(register int i=1;i<=n;++i)
for(register int j=0;j<(1<<8);++j)
for(register int k=-8;k<=7;++k)
if(f[i][j][k+8]!=inf)
{
if(j&1)
f[i+1][j>>1][k+7]=Min(f[i+1][j>>1][k+7],f[i][j][k+8]);
else
{
int x=inf;
for(register int h=0;h<=7;++h)
if(!((j>>h)&1))
{
if(i+h>x)
break;
x=Min(x,i+h+B[i+h]);
f[i][j|(1<<h)][h+8]=Min(f[i][j|(1<<h)][h+8],f[i][j][k+8]+(i+k?(T[i+k]^T[i+h]):0));
}
}
}
int ans=inf;
for(register int k=0;k<=8;++k)
ans=Min(ans,f[n+1][0][k]);
printf("%d\n",ans);
}
return 0;
}

【题解】Luogu P2157 [SDOI2009]学校食堂的更多相关文章

  1. P2157 [SDOI2009]学校食堂Dining

    题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...

  2. P2157 [SDOI2009]学校食堂

    题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...

  3. P2157 [SDOI2009]学校食堂 (dp+状态压缩)

    题目链接:传送门 题目: 题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人 ...

  4. 洛谷 P2157 [SDOI2009]学校食堂

    题意简述 每个人有一个口味,食堂每次只能为一个人做菜 做每道菜所需的时间是和前一道菜有关的,若前一道菜的对应的口味是a,这一道为b,则做这道菜所需的时间为a 异或 b 每个人都有一个容忍度,最多允许紧 ...

  5. Luogu 2157 [SDOI2009]学校食堂 - 状压dp

    Solution 比较好想的dp, 但是坑不少QAQ, 调半天 由于容忍度 $b_i$<= 7, 所以可以考虑将第$i$个人接下来的$b_i$ 个人作为一个维度记录状态. 于是我们定义数组$f[ ...

  6. P2157 [SDOI2009]学校食堂 状压DP

    题意: 排队买饭,时间为前一个人和后一个人的异或和,每个人允许其后面B[i] 个人先买到饭,问最少的总用时. 思路: 用dp[i][j][k] 表示1-i-1已经买好饭了,第i个人后面买饭情况为j,最 ...

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

    [BZOJ1226][SDOI2009]学校食堂Dining Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满 ...

  8. BZOJ 1226: [SDOI2009]学校食堂Dining

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 730  Solved: 446[Submit][ ...

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

    学校食堂 题目链接:https://www.luogu.org/problem/P2157 数据范围:略. 题解: 发现$B$特别小,很容易想到状压. 即在$dp$的时候弄出来$f_{(i,j,k)} ...

随机推荐

  1. Linux系统文件目录

    下面的示例是我个人的亚马逊云服务器,查看了几个关键目录的文件信息. 可以注册一个账号,免费试用一年,自己用来玩,还是很不错的 .https://aws.amazon.com/cn/ec2/ 根目录下面 ...

  2. Linux下利用Valgrind工具进行内存泄露检测和性能分析

    from http://www.linuxidc.com/Linux/2012-06/63754.htm Valgrind通常用来成分析程序性能及程序中的内存泄露错误 一 Valgrind工具集简绍 ...

  3. iOS 元件组件-创建静态库static library

    概述 在项目开发的过程中,经常使用静态库文件.例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口,而不能知道其中实现的细节. 库是一些没有mai ...

  4. linux临时网络配置

    1.设置IP地址: ifconfig ens33 192.168.60.231/24 2.添加默认网关路由 $Route add default gw <默认网关地址> 例:#route ...

  5. sourceInsight工具移除不掉项目 source Insight Add and Remove Project Files

    问题描述: sourceInsight创建的项目,有时候会遇到Remove Project 报错,移除不成功的情况. 解决办法: 进入到sourceinsight的安装目录.删除掉保存的工程文件信息即 ...

  6. 混合型log,info按大小分,error按日期

    1.配置文件 <?xml version="1.0" encoding="utf-8"?> <configuration> <!- ...

  7. VS2010 发布网站时文件丢失解决办法

    网站项目中包含了一写rdlc的东西,发布网站选择仅限运行此应用程序所需文件,发布成功后发现这两个文件夹都没发布出来,找了下原因,解决办法是选择文件打开属性窗口找到生成操作,选项选择“内容”,重新发布, ...

  8. Python并发编程之线程池/进程池--concurrent.futures模块

    一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/ ...

  9. javascript_函数式_链式编程

  10. cocos v3.10 下载地址

    官方给出的是在:http://www.cocos2d-x.org/filedown/CocosForWin-v3.10.exe如果下载不了,可以在这里下http://cdn.cocos2d-x.org ...