SDOI 2009 学校食堂 状压dp
这个题的关键处
1 紧跟着他的bi个人 —— 由此得出任意一个状态都可以表示为 有第一个人没吃到饭做分隔的前面
所有人已吃饭,并用1<<8表示之后的(包括他)的八个人的状态
2 信息仍然是上一个 但是根据此信息就可以的出接口数组,就是作为状态转移接口的一维即
——最后一个吃饭的人
据此可得 f(a,b,c) a——前(a-1)个人已吃
b——八人状态
c——上一个人吃饭到i的距离
#include<cstdio>
#include<cstring>
#define f(a,b,c) g[a][b][c+8]
#define inf 0x3f3f3f3f
#define Min(a,b) a<b?a:b
using namespace std;
int g[][<<][],t[],e[],n,full=(<<)-;
int main()
{
freopen("dining.in","r",stdin);
freopen("dining.out","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d%d",&t[i],&e[i]);
memset(g,0x3f,sizeof(g));
f(,,-)=;
int lim=n;
for(int l=;l<;l++)
{
if(+l>lim)break;
lim=Min(lim,+l+e[+l]);//一定不要忘了这里限制初始化,影响很大!!
f(,<<l,l)=;
}
for(int i=;i<=n;i++)
for(int j=;j<=full;j++)
for(int k=-;k<=;k++)
if(f(i,j,k)<inf)
{
if(j&) f(i+,j>>,k-)=Min(f(i+,j>>,k-),f(i,j,k));//本质上是一个小剪枝
else
{
int limit=n;
for(int l=;l<;l++)
if(((<<l)&j)==)
{
if(i+l>limit)break;
limit=Min(limit,i+l+e[i+l]);
f(i,j|(<<l),l)=Min(f(i,j|(<<l),l),f(i,j,k)+(t[k+i]^t[i+l]));
}
}
}
int ans=inf;
for(int i=-;i<;i++) ans=Min(ans,f(n+,,i));
printf("%d\n",ans);
}
return ;
}
SDOI 2009 学校食堂 状压dp的更多相关文章
- BZOJ 1226 学校食堂(状压DP)
状压DP f(i,j,k)表示前i−1个人已经吃了饭,且在i之后的状态为j的人也吃了饭(用二进制表示后面的状态),最后吃的那个人是i之后的第k个 (注意k可以是负数) 然后 如果j&1=1那么 ...
- P2157 [SDOI2009]学校食堂 状压DP
题意: 排队买饭,时间为前一个人和后一个人的异或和,每个人允许其后面B[i] 个人先买到饭,问最少的总用时. 思路: 用dp[i][j][k] 表示1-i-1已经买好饭了,第i个人后面买饭情况为j,最 ...
- Luogu 2157 [SDOI2009]学校食堂 - 状压dp
Solution 比较好想的dp, 但是坑不少QAQ, 调半天 由于容忍度 $b_i$<= 7, 所以可以考虑将第$i$个人接下来的$b_i$ 个人作为一个维度记录状态. 于是我们定义数组$f[ ...
- bzoj1226/luogu2157 学校食堂 (状压dp)
我们先约定:(左) 窗口_人人人人人 (右) 可以发现,我们只需要知道最靠左的还没打饭的人 以及它身后7个人的状态 以及上一个打饭的人是谁 因为他左面的就都打过了 右面7个人以后肯定还没打 可以设f[ ...
- SDOI 2009 学校食堂
洛谷 P2157 [SDOI2009]学校食堂 洛谷传送门 JDOJ 1924: [SDOI2009]学校食堂Dining JDOJ传送门 Description 小F 的学校在城市的一个偏僻角落,所 ...
- [学习笔记]状压dp
状压 \(dp\) 1.[SDOI2009]Bill的挑战 \(f[i][j]\) 表示匹配到字符串的第 \(i\) 位状态为 \(j\) 的方案数 那么方程就很明显了,每次枚举第 \(i\) 位的字 ...
- bzoj 1226 [SDOI2009]学校食堂Dining(状压DP)
Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以 ...
- [luoguP2157] [SDOI2009]学校食堂Dining(状压DP)
传送门 这种鬼畜的状压DP...第一次见 看到 0 <= Bi <= 7 就应该想到状态压缩,然而此题实在太鬼畜,想到也没什么乱用 f[i][j][k]表示前i-1个人全部吃完,i~i+7 ...
- Codevs 2009 大dota英雄 2013年省队选拔赛辽宁(状压DP)
2009 大dota英雄 2013年省队选拔赛辽宁 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 话说退役后的生活好无聊啊,以 ...
随机推荐
- JavaSE 第二次学习随笔(关于内存的小题)
class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println(&quo ...
- pygame小游戏之坦克大战
以前在学校的时候无聊的学了会pygame.看了大概一周的教学视频,做出来个坦克大战的小游戏 Python3.5 pycharm import pygame,sys,time from random ...
- 003---Python基本数据类型--列表
列表 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px ...
- javaWeb总结
url传值时:如out.println("<td><a href = 'delete.jsp?user=" + user + "'>删除</ ...
- js获取浏览器内容宽高(小计)
<SCRIPT LANGUAGE="JavaScript">var s = "";s += "\r\n网页可见区域宽:"+ d ...
- Oracle11.2.0.3 RAC配置ODBC成功案例记录
最终使用字符串如下: String url="jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = scan- ...
- ios下 active 演示激活
document.body.addEventListener('touchstart', function () { });
- 1018 Public Bike Management (30 分)(图的遍历and最短路径)
这题不能直接在Dijkstra中写这个第一 标尺和第二标尺的要求 因为这是需要完整路径以后才能计算的 所以写完后可以在遍历 #include<bits/stdc++.h> using n ...
- LeetCode 29——两数相除
1. 题目 2. 解答 2.1. 方法一 题目要求不能使用乘法.除法和除余运算,但我们可以将除法转移到对数域. \[ \frac{a}{b} = e^{\frac{lna}{lnb}} = e^{ln ...
- gitbook生成的_book文件本地打开后链接失效问题
Gitbook 生成本地 html 的问题 在本地用 gitbook-cli根据 Summary 生成目录 然后在每个 md 文件里书写内容 然后用 gitbook serve .生成本地 html ...