【BZOJ1226】学校食堂(动态规划,状态压缩)

题面

BZOJ

洛谷

题解

发现\(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】学校食堂(动态规划,状态压缩)的更多相关文章

  1. BZOJ-1226 学校食堂Dining 状态压缩DP

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...

  2. [动态规划]状态压缩DP小结

     1.小技巧 枚举集合S的子集:for(int i = S; i > 0; i=(i-1)&S) 枚举包含S的集合:for(int i = S; i < (1<<n); ...

  3. [POJ 2923] Relocation (动态规划 状态压缩)

    题目链接:http://poj.org/problem?id=2923 题目的大概意思是,有两辆车a和b,a车的最大承重为A,b车的最大承重为B.有n个家具需要从一个地方搬运到另一个地方,两辆车同时开 ...

  4. POJ 1185 炮兵阵地(动态规划+状态压缩)

    炮兵阵地 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原( ...

  5. ACM学习历程—HDU1584 蜘蛛牌(动态规划 && 状态压缩 || 区间DP)

    Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起 ...

  6. HDOJ-1074(动态规划+状态压缩)

    Doing Homework HDOJ-1074 1.本题主要用的是状态压缩的方法,将每种状态用二进制压缩表示 2.状态转移方程:dp[i|(1<<j)]=min(dp[i|(1<& ...

  7. [ZOJ 3662] Math Magic (动态规划+状态压缩)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3662 之前写过这道题,结果被康神吐槽说代码写的挫. 的确,那时候 ...

  8. 动态规划状态压缩-poj1143

    题目链接:http://poj.org/problem?id=1143 题目描述: 代码实现: #include <iostream> #include <string.h> ...

  9. 3.4 熟练掌握动态规划——状态压缩DP

    从旅行商问题说起—— 给定一个图,n个节点(n<=15),求从a节点出发,经历每个节点仅一次,最后回到a,需要的最短时间. 分析: 设定状态S代表当前已经走过的城市的集合,显然,S<=(1 ...

  10. 动态规划(状态压缩):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 ...

随机推荐

  1. 海思NB-IOT HI2115芯片电压域的问题

    1. 先看模块引脚,利尔达NB86-G模块 2. VDD_IO_R1, VDD_IO_R2, VDD_IO_L1 and VDD_IO_L2 control the IO voltages on PI ...

  2. 面向忙碌开发者的 Android

    面向忙碌开发者的 Android passiontim 关注 2016.11.19 21:41* 字数 4013 阅读 2967评论 2喜欢 92 面向忙碌开发者的 Android 视频教程(Tuts ...

  3. java 多路分发

    1.概念 一个函数处理多种类型,其实和多态差不多. 但是要处理两种或者多种类型的数据时,就需要判断每种类型以及每种类型所对应的处理.(PS:我只是在走别人的老路,网上一搜这种概念,博客一大堆,我不知道 ...

  4. Qt 利用XML文档,写一个程序集合 二

    接上一篇文章https://www.cnblogs.com/DreamDog/p/9213915.html XML文档的读写 一个根节点,下面每一个子节点代表一个子程序,内容为子程序名字,图标路径,e ...

  5. 跟浩哥学自动化测试Selenium -- Selenium简介 (1)

    Selenium 简介 Selenium 是一款开源的web自动化测试工具,用来模拟对浏览器的操作(主要是对页面元素的操作),简单来讲,其实就是一个jar包.Selenium早期的版本比如1.0市场占 ...

  6. Teaching Machines to Understand Us 让机器理解我们 之一 引言

    Teaching Machines to Understand Us   By Tom Simonite  MIT Technology Review Vol.118 No.5 2015 让机器理解我 ...

  7. Cross origin requests are only supported for protocol schemes: http, data, chrome,chrome-extension的问题

    Cross origin requests are only supported for protocol schemes: http, data, chrome,chrome-extension的问 ...

  8. Python Requests库简单入门

    我对Python网络爬虫的学习主要是基于中国慕课网上嵩天老师的讲授,写博客的目的是为了更好触类旁通,并且作为学习笔记之后复习回顾. 1.引言 requests 库是一个简洁且简单的处理HTTP请求的第 ...

  9. 软件工程-东北师大站-第七次作业(PSP)

    1.本周PSP 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图 4.本周PSP饼状图

  10. struts传值方式ModelDriven的使用

    struts传值不需要用到request,struts会处理好. 1.不是面向对象直接在jsp页面和Java代码都写:name,password... 以下为面向对象 2.action类实现Model ...