链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5550

题意:

一个大楼有n(2≤n≤4000)层,每层可以建一个乒乓球房或者一个游泳房,且每种房间在大楼里至少要有一个。
已知每层有ti个乒乓球运动员和pi个游泳运动员(1≤ti,pi≤1e9)。
问怎样建房,才能使得所有运动员到相应房间的总距离最小,输出最小值。

分析:

因为每种房间在大楼里至少要有一个,所以肯定会有这样一种状态:第i层是一种房间,第i+1层是另一种房间。
所以可以设d[i][x]:第i层是x房间,且第i+1层是另一种房间时,前i层的最优解。
则状态转移方程为:d[i][x] = min(d[k][x^1] + 第k+1~i层都是x房间时所产生的最小总距离),1≤k<i。
其中x^1表示另一种房间,求第L~R层都是x房间时所产生的最小总距离可以用前缀和预处理,具体看代码。
BTW,此题为2015年CCPC的银牌题。

代码:

 #include <cstdio>
#include <algorithm>
using namespace std; typedef long long int LLI;
const LLI INF = 0x3f3f3f3f3f3f3f3f;
const int UP = + ;
LLI sum[UP][]; // sum[i][x]:前i层x运动员的总人数
LLI dist[UP][]; // dist[i][x]:前i层所有x运动员到第0层的总距离
LLI d[UP][]; // d[i][x]:第i层是x房间,且第i+1层是另一种房间时,前i层的最优解 LLI toLeft(int L, int R, int x) { // 第L~R层的所有x运动员到第L-1层的总距离
return (dist[R][x]-dist[L-][x]) - (sum[R][x]-sum[L-][x]) * (L-);
} LLI toRight(int L, int R, int x) { // 第L~R层的所有x运动员到第R+1层的总距离
return (sum[R][x]-sum[L-][x]) * (R+) - (dist[R][x]-dist[L-][x]);
} LLI process(int L, int R, int x) { // 第L~R层的所有x运动员到第L-1层或R+1层的总距离最小值
int M = L + (R-L)/;
return toLeft(L, M, x) + (M+>R ? : toRight(M+, R, x));
} int main() {
int T, n;
LLI t, p;
scanf("%d", &T);
for(int cases = ; cases <= T; cases++) {
scanf("%d", &n);
for(int i = ; i <= n; i++) {
scanf("%lld%lld", &t, &p);
sum[i][] = sum[i-][] + t;
sum[i][] = sum[i-][] + p;
dist[i][] = dist[i-][] + t*i;
dist[i][] = dist[i-][] + p*i;
}
LLI ans = INF;
for(int i = ; i < n; i++) {
d[i][] = toRight(, i, ); // 前i层都是0房间,第i+1层是1房间的总距离
d[i][] = toRight(, i, ); // 前i层都是1房间,第i+1层是0房间的总距离
for(int k = ; k < i; k++) {
d[i][] = min(d[i][], d[k][] + process(k+,i,)); // 第k+1~i层都是0房间
d[i][] = min(d[i][], d[k][] + process(k+,i,)); // 第k+1~i层都是1房间
}
ans = min(ans, d[i][] + toLeft(i+,n,)); // 后i+1层都是1房间
ans = min(ans, d[i][] + toLeft(i+,n,)); // 后i+1层都是0房间
}
printf("Case #%d: %lld\n", cases, ans);
}
return ;
}

HDU 5550 - Game Rooms(DP + 前缀和预处理)的更多相关文章

  1. HDU - 5550 Game Rooms 【DP+前缀和】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5550 题意 一撞大楼有N层楼,然后每层楼都有一部分人喜欢打羽毛球,一部分人喜欢打乒乓球 但是每层楼只能 ...

  2. 山区建小学(区间dp+前缀和+预处理)

    [题目描述] 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0 < i ...

  3. HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化

    HDU 2829 区间DP & 前缀和优化 & 四边形不等式优化 n个节点n-1条线性边,炸掉M条边也就是分为m+1个区间 问你各个区间的总策略值最少的炸法 就题目本身而言,中规中矩的 ...

  4. BZOJ-1587|前缀和 预处理 dp||叶子合并leaves

    叶子合并leaves Description 在一个美丽的秋天,丽丽每天都经过的花园小巷落满了树叶,她决定把树叶堆成K堆,小巷是笔直的 共有N片树叶(树叶排列也是笔直的),每片树叶都有一个重量值,并且 ...

  5. T2988 删除数字【状压Dp+前缀和优化】

    Online Judge:从Topcoder搬过来,具体哪一题不清楚 Label:状压Dp+前缀和优化 题目描述 给定两个数A和N,形成一个长度为N+1的序列,(A,A+1,A+2,...,A+N-1 ...

  6. hdu 4739 状压DP

    这里有状态压缩DP的好博文 题目:题目比较神,自己看题目吧 分析: 大概有两种思路: 1.dfs,判断正方形的话可以通过枚举对角线,大概每次减少4个三角形,加上一些小剪枝的话可以过. 2.状压DP,先 ...

  7. HDU 1011 树形背包(DP) Starship Troopers

    题目链接:  HDU 1011 树形背包(DP) Starship Troopers 题意:  地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...

  8. HDU 1559 最大子矩阵 (DP)

    题目地址:pid=1559">HDU 1559 构造二维前缀和矩阵.即矩阵上的点a[i][j]表示左上方的点为(0,0),右下方的点为(i,j)的矩阵的和.然后枚举每一个矩阵的左上方的 ...

  9. hdu 2296 aC自动机+dp(得到价值最大的字符串)

    Ring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

随机推荐

  1. jQuery设置下拉框select 默认选中第一个option

    $("#id option:first").prop("selected", 'selected');

  2. iOS调用系统页面中文显示

    在开发的过程中,我们会接入很多的sdk,比如相机,相册,是否允许获取位置等,大多数的情况下是默认显示英文, 在plist文件里面添加一个key就可以了,如下图: key:Localization na ...

  3. 山东第四届省赛: Boring Counting 线段树

    http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=3237 Problem H:Boring Counting Time Limit: 3 Sec  ...

  4. java泛型详解(加一点语法糖)

    首先请看如下代码: public class Test{ public static void main(String str[]) { Hashtable h =new Hashtable(); h ...

  5. 浅谈JVM-图解类加载机制

    一.目录 二.类加载机制流程 1.什么是类加载机制? JVM把class文件加载到内存里面,并对数据进行校验.准备.解析和初始化,最终能够被形成被JVM可以直接使用的Java类型的过程. 2.类加载流 ...

  6. cf121C. Lucky Permutation(康托展开)

    题意 题目链接 Sol 由于阶乘的数量增长非常迅速,而\(k\)又非常小,那么显然最后的序列只有最后几位会发生改变. 前面的位置都是\(i = a[i]\).那么前面的可以直接数位dp/爆搜,后面的部 ...

  7. 【代码笔记】iOS-cell折叠

    一,效果图. 二,工程图. 三,代码. AppDelegate.h #import <UIKit/UIKit.h> //加入头文件 #import "myQQView.h&quo ...

  8. [转]c# winform tcp connect timeout 连接超时设置

    转自:https://www.cnblogs.com/jhlong/p/5622336.html 简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的 ...

  9. redis 命令行查看修改配置文件项、配置文件说明

    命令行查看修改配置文件项 config get | config set | config rewrite config get requirepass // 获取密码config set requi ...

  10. web 应用响应乱码问题

    非西欧语系乱码原因 在没有设置任何内容类型或编码之前,HttpServletResponse使用的字符编码默认是ISO-8859-1.也就是说,如果直接输出中文,在浏览器上就会看到乱码. 有两种方式可 ...