【BZOJ1226】学校食堂(动态规划,状态压缩)
【BZOJ1226】学校食堂(动态规划,状态压缩)
题面
题解
发现\(b\)很小,意味着当前这个人最坏情况下也只有后面的一小部分人在他前面拿到饭。
所以整个结果的大致顺序是不会变化的。
对于一个人,他要占用的时间之和前面那个拿饭的人有关。
而他前面那个拿饭的人在队列中只有两种情况,一种在他前面,一种在他后面。
显然在他前面对于当前这个人是没有任何影响的,有问题的只有在他后面的人先拿饭。
所以可以状压后面哪些人在当前这个人之前拿到了饭。
所以设状态\(f[i][j][k]\)表示当前第\(i\)个人,\(i\)和后面\(b\)个人拿饭的情况是\(j\),上一个拿饭的人是\(i+k\),并且\(i\)之前的所有人都拿到了饭的最小值。
注意一下\(k\)的值域范围\([-8,7]\)。
考虑转移
首先检查一下当前这个位置是否已经被解决。
如果是,直接转移到\(f[i+1][j>>1][k-1]\),\(k-1\)的原因是向后推了一位。
否则,枚举当前解决谁,计算一下贡献就好了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define RG register
#define MAX 1010
#define cmin(a,b) (a=((a>b)?(b):(a)))
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int f[MAX][1<<8][17],n,a[MAX],b[MAX],ans;
int calc(int i,int j){if(!i)return 0;return a[i]^a[j];}
int main()
{
int T=read();
while(T--)
{
n=read();ans=1e9;
for(int i=1;i<=n;++i)a[i]=read(),b[i]=read();
memset(f,63,sizeof(f));f[1][0][-1+8]=0;
for(int i=1;i<=n;++i)
for(int j=0;j<1<<8;++j)
for(int k=-8;k<=7;++k)
{
if(f[i][j][k+8]>=1e9)continue;
if(j&1)cmin(f[i+1][j>>1][k+7],f[i][j][k+8]);
else
{
int lst=1e9;
for(int l=0;l<=7;++l)
{
if(i+l>lst)break;if(j&(1<<l))continue;
cmin(lst,b[i+l]+i+l);
cmin(f[i][j|(1<<l)][l+8],f[i][j][k+8]+calc(k+i,l+i));
}
}
}
for(int i=0;i<=8;++i)cmin(ans,f[n][1][i]);
printf("%d\n",ans);
}
return 0;
}
【BZOJ1226】学校食堂(动态规划,状态压缩)的更多相关文章
- BZOJ-1226 学校食堂Dining 状态压缩DP
1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...
- [动态规划]状态压缩DP小结
1.小技巧 枚举集合S的子集:for(int i = S; i > 0; i=(i-1)&S) 枚举包含S的集合:for(int i = S; i < (1<<n); ...
- [POJ 2923] Relocation (动态规划 状态压缩)
题目链接:http://poj.org/problem?id=2923 题目的大概意思是,有两辆车a和b,a车的最大承重为A,b车的最大承重为B.有n个家具需要从一个地方搬运到另一个地方,两辆车同时开 ...
- POJ 1185 炮兵阵地(动态规划+状态压缩)
炮兵阵地 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原( ...
- ACM学习历程—HDU1584 蜘蛛牌(动态规划 && 状态压缩 || 区间DP)
Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起 ...
- HDOJ-1074(动态规划+状态压缩)
Doing Homework HDOJ-1074 1.本题主要用的是状态压缩的方法,将每种状态用二进制压缩表示 2.状态转移方程:dp[i|(1<<j)]=min(dp[i|(1<& ...
- [ZOJ 3662] Math Magic (动态规划+状态压缩)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3662 之前写过这道题,结果被康神吐槽说代码写的挫. 的确,那时候 ...
- 动态规划状态压缩-poj1143
题目链接:http://poj.org/problem?id=1143 题目描述: 代码实现: #include <iostream> #include <string.h> ...
- 3.4 熟练掌握动态规划——状态压缩DP
从旅行商问题说起—— 给定一个图,n个节点(n<=15),求从a节点出发,经历每个节点仅一次,最后回到a,需要的最短时间. 分析: 设定状态S代表当前已经走过的城市的集合,显然,S<=(1 ...
- 动态规划(状态压缩):BZOJ 2621 [Usaco2012 Mar]Cows in a Skyscraper
2621: [Usaco2012 Mar]Cows in a Skyscraper Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 303 Sol ...
随机推荐
- hive 数据导入
Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中导入数据到Hive表:(2).从HDFS上导入数据到Hive表:(3).从别的表中查询出相应的数据并导入到Hive表中:(4).在 ...
- 八、Django之Models(译)
模型(Models) 模型是你的数据的唯一的.确定的信息源. 它包含你所储存数据的必要字段和行为. 通常,每个模型对应数据库中唯一的一张表. 基础: 每个模型都是一个Python类,它们都是djang ...
- MAC下Android的Eclipse开发环境搭建
原文链接:https://www.cnblogs.com/macro-cheng/archive/2011/09/30/android-001.html 一.Eclipse的下载 到网站:http:/ ...
- VMWARE网络配置内网与外网互ping
新增网络适配器 设置自定义VMnet0 自动桥接 NAT的网络要配置网关 我们在CentOS中打开ifcfg-ens33文件(每个系统文件名都不同,但都是以ifcfg-ens33开头的文件),进行修改 ...
- Mysql 单表主从同步
先配主从同步,后将主库表老数据传输到从库 说明:api-server的数据库为主,其他harbor为从 1.master 配置文件更改 [mysqld] log-bin = mysql-bin ser ...
- Spark Shell Examples
Spark Shell Example 1 - Process Data from List: scala> val pairs = sc.parallelize( List( ("T ...
- PowerDesigne 建立概念数据模型
本文主要介绍PowerDesigner概念数据模型以及实体.属性创建. 一.新建概念数据模型1)选择File-->New,弹出如图所示对话框,选择CDM模型(即概念数据模型)建立模型. 2)完成 ...
- JUnit initializationError错误
一.JUnit Test 测试 initializationError错误 MyMaincom.test.sunc.MyMaininitializationError(com.test.sunc.My ...
- linux-sftp-指定端口号登录远程主机
sftp -oPort=60001 root@192.168.0.254 -o选项来指定端口号 -oPort=远程端口号
- 20172311-ASL测试 2018-1938872补充博客
20172311-ASL测试 2018-1938872补充博客 课程:<程序设计与数据结构> 班级: 1723 姓名: 赵晓海 学号: 20172311 实验教师:王志强老师 测试日期:2 ...