[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 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以 ...
随机推荐
- 雨林木风ghost win7 64位快速装机版V2016年
雨林木风ghost win7 64位快速装机版V2016年2月 系统下载:http://www.xitongma.com 系统概述 雨林木风ghost win7 64位旗舰装机版自动无人值守安装,采用 ...
- Linux下文件以及文件名编码转换
1.查看文件编码方式--file 文件名(但不是很准确) yang@mint-linux ~ $ file baidu.html baidu.html: HTML document, UTF-8 Un ...
- iOS 查看包架构信息
lipo -info libUMSocial_Sdk_4.2.a 查看包架构信息
- 单调栈3_水到极致的题 HDOJ4252
A Famous City 题目大意 给出正视图 每一列为楼的高度 最少有几座楼 坑点 楼高度可以为0 代表没有楼 贡献了两发RE 原因 if(!s.empty()&&tem){s. ...
- ios 使用NSRegularExpression解析正则表达式
初始化一个 NSRegularExpression 对象 注:_str是要匹配的字符串 NSRegularExpression *regex = [NSRegularExpression regu ...
- 用”人话”解释CNN —— 对单个特征图进行视觉化
转载自:http://nooverfit.com/wp/pycon-2016-tensorflow-研讨会总结-tensorflow-手把手入门-用人话解释cnn 首先什么是CNN? 其实, 用”人话 ...
- 清理数据库事务——SQL语句
清除流程内部的所有相关数据 eg1: declare @procedureTemp table ( [ProcedureCode] varchar(10) ) declare @ProcedureCo ...
- lucene4.7实例详解
java.lang.UnsupportedClassVersionError: org/apache/lucene/index/IndexableField : Unsupported major.m ...
- SQLyog连接数据库 提示错误plugin caching_sha2_password could not be loaded
1.打开mysql cmd 2.执行语句 ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; # ...
- 关于windows server 2003 IE 不能访问 https问题
https://xx.wosign.com/FAQ/Windows2003_server_sha256_support_problem.html 补丁地址: https://xx.wosign.com ...