[luoguP2157] [SDOI2009]学校食堂Dining(状压DP)
这种鬼畜的状压DP。。。第一次见
看到 0 <= Bi <= 7 就应该想到状态压缩,然而此题实在太鬼畜,想到也没什么乱用
f[i][j][k]表示前i-1个人全部吃完,i~i+7的人的吃饭状态为j,最后一个吃饭的人和i距离为k
因为有可能第i个人及以后的人都好没有吃,最后一个吃饭的人是前i-1个人中的,考虑Bi的范围,那么 -8 <= k <= 7
所以最后一维统一加上8,防止出现负数下标
如果 j&1,那么f[i][j][k]可以直接转移到f[i+1][j>>1][k-1],那么f[i][j][k]也就没用了,因为这两个状态实质上是一个
否则,枚举集合中新的一个元素来更新f[i][j ^ (1<<l)][l]
初始化:f[i][j][k] = INF,f[1][0][-1] = 0
最终答案:f[n+1][0][-8,0]
#include <cstdio>
#include <cstring>
#define N 1011
#define f(i, j, k) (g[i][j][k + 8])
#define min(x, y) ((x) < (y) ? (x) : (y)) int T, n, ans;
int a[N], b[N], g[N][1 << 8][16];
//g[i][j][k],i表示前i-1个人都吃完了,j表示i~i+7是否吃的集合,k表示最后一个人是i+k吃的
//k属于[-8,7]所以k这一维要统一加上8 inline int calc(int i, int j)
{
if(!i) return 0;
return a[i] ^ a[j];
} int main()
{
int i, j, k, l, r;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(i = 1; i <= n; i++) scanf("%d %d", &a[i], &b[i]);
memset(g, 127, sizeof(g));
f(1, 0, -1) = 0;
for(i = 1; i <= n; i++)
for(j = 0; j < (1 << 8); j++)
for(k = -8; k <= 7; k++)
if(f(i, j, k) <= 1e9)
{
if(j & 1) f(i + 1, j >> 1, k - 1) = min(f(i + 1, j >> 1, k - 1), f(i, j, k));
//可以转移的话直接转移到i+1,else的处理到i+1再处理
else
{
r = 1e9;
for(l = 0; l <= 7; l++)
if(!(j & (1 << l)))
{
if(i + l > r) break;
r = min(r, i + l + b[i + l]);
f(i, j ^ (1 << l), l) = min(f(i, j ^ (1 << l), l), f(i, j, k) + calc(i + k, i + l));
}
}
}
ans = 1e9;
//f[n + 1][0][-8,0]
for(i = -8; i <= -1; i++) ans = min(ans, f(n + 1, 0, i));
printf("%d\n", ans);
}
return 0;
}
[luoguP2157] [SDOI2009]学校食堂Dining(状压DP)的更多相关文章
- 【BZOJ1226】[SDOI2009]学校食堂Dining 状压DP
[BZOJ1226][SDOI2009]学校食堂Dining Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满 ...
- [LuoguP2157][SDOI2009]学校食堂_状压dp
学校食堂 题目链接:https://www.luogu.org/problem/P2157 数据范围:略. 题解: 发现$B$特别小,很容易想到状压. 即在$dp$的时候弄出来$f_{(i,j,k)} ...
- BZOJ 1226 [SDOI2009]学校食堂Dining ——状压DP
看到B<=8,直接状态压缩即可. dp[i][j][k]表示当前相对位置是关于i的,并且i以前的已经就餐完毕,j表示i和之后的就餐情况,k表示上一个就餐的人的相对位置. 然后Dp即可 #incl ...
- BZOJ1226 SDOI2009学校食堂(状压dp)
由于Bi<=7,考虑状压. 如果考虑前i个位置的话,状态里需要压入前7个人后7个人,显然是跑不动的. 那么改成考虑前i个人.于是设f[i][j][k]表示前i个人都已吃完饭,i+1后面7个人的吃 ...
- luogu2157 [SDOI2009]学校食堂 局部状压
题目大意 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...
- BZOJ-1226 学校食堂Dining 状态压缩DP
1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...
- BZOJ 1226: [SDOI2009]学校食堂Dining
1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 730 Solved: 446[Submit][ ...
- bzoj 1226 [SDOI2009]学校食堂Dining(状压DP)
Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以 ...
- 1226: [SDOI2009]学校食堂Dining - BZOJ
Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以 ...
随机推荐
- DVWA之跨站请求伪造(CSRF)
CSRF全称是Cross site request forgery ,翻译过来就是跨站请求伪造. CSRF是指利用受害者尚未失效的身份认证信息(cookie,会话信息),诱骗其点击恶意链接或者访问包含 ...
- -bash: mail: command not found
近日,安装了一个最小化的centos 6.3 6,用mail发送邮件进行测试的时候提示-bash: mail: command not found mailx没有安装,于是: yum -y insta ...
- Windows系统下如何优化Android Studio
Android Studio将是Android开发大势所趋. 安装Android Studio时需注意的细节: · 找到安装目录bin目录下idea.properties 最后一行加入: dis ...
- 批处理文件 bat
删除D盘的所有文件:del /a /f /q d:\*.* 删除指定目录的指定扩展名的文件:del /a /f /q 目录:\*.jpg 删除当前目录下的指定扩展名的文件(指定扩展名为jpg):del ...
- 洛谷 P2483 [SDOI2010]魔法猪学院
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
- Hibernate 多表查询 - Criteria添加子字段查询条件 - 出错问题解决
Criteria 查询条件如果是子对象中的非主键字段会报 could not resolve property private Criteria getCriteria(Favorite favori ...
- Bootstrap 原始按钮
Bootstrap 原始按钮 <!DOCTYPE html><html><head><meta http-equiv="Content-Type&q ...
- 经典的7种排序算法 原理C++实现
排序是编程过程中经常遇到的操作,它在很大程度上影响了程序的执行效率. 7种常见的排序算法大致可以分为两类:第一类是低级排序算法,有选择排序.冒泡排序.插入排序:第二类是高级排序算法,有堆排序.排序树. ...
- CSS 不换行 white-space 属性详解
实例 规定段落中的文本不进行换行: p { white-space: nowrap } 可能的值 值 描述 normal 默认.空白会被浏览器忽略. pre 空白会被浏览器保留.其行为方式类似 HTM ...
- 继上次编译openwrt之后,添加web界面
上编博客写了关于openwrt编译环境和编译一个默认配置的openwrt系统. 现在我正在做如何添加web界面.(hiwooya自带的luci web) 方法如下: 首先在编译环境中配置 make m ...