这是CCPC女生专场的一道dp题。大佬们都说它简单,我并没有感到它有多简单。

先说一下题意:在一条直线上,有n个教室,现在我要在这些教室里从左到右地建设一些作为糖果屋,每个教室都有自己的坐标xi 和建造糖果屋的费用ci ,

如果在这里建造一个糖果屋,那么花费ci ,如果不建造糖果屋,则花费是当前教室的坐标与左边最靠近当前教室的糖果屋坐标之差,问最小花费。

一看这是个求最优解的问题,应该明白这是个dp问题,现在来考虑该问题状态的定义:

当我建设到第i个教室的时候,我有两种选择,建糖果屋或者不建糖果屋,影响我决策的是在左边离我最近的糖果屋的位置。并且我在建设前i个教室的时候,明显可以看出有i种相互独立的不同方案,即:

将离i最近的且在左边糖果屋建在  1号,2号,3号,......,k号,......,i号教室,所有的方案都可以分成这i类。我想知道建设前i个教室的最小费用,我只需挑出这i种方案中花费最小的那个就行。

并且,在我后面继续建设的时候,我一定还会用到这i种方案做基础,比如说我要建设第i+1个房间了,将最近的糖果屋建设在1~i已经有了现成的方案供我们选择,我们额外需要考虑的只是将糖果屋

建设在第i+1间教室时的情况。

于是我们定义状态dp[i][j]---->现在已经建设到第i个教室了,离i最近且在左边的的教室号为j时,我们能求得的最小花费。

状态转移方程:

if(i == j) dp[i][j] = minn[i - 1] + ci;

else dp[i][j] = dp[i - 1][j] + (xi - xj);

其中minn[k]指的是建设前k间教室的最小花费。

显然,当我们把最近的糖果屋建设在i号教室时,我们需要建设前i - 1间教室的最优解 + 建 i 号教室的费用,才能保证当前状态的最优解的生成。

这个minn[k]是可以顺带着算出来的,详见代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define maxn 3005
#define F 0x7f
#define INF 0x3f3f3f3f3f3f3f
using namespace std;
struct room
{
long long x,c;
};
room store[maxn];
long long dp[][maxn];
long long minn[maxn];
const long long zero = ;
bool cmp(const room& a,const room& b)
{
return a.x < b.x;
}
int main()
{
int n;
while(scanf("%d",&n) == ){
for(int i = ;i <= n;++i) dp[][i] = INF;
for(int i = ;i <= n;++i) dp[][i] = ;
for(int i = ;i <= n;++i) minn[i] = INF;
for(int i = ;i <= n;++i) scanf("%lld%lld",&store[i].x,&store[i].c);
sort(store + ,store + n + ,cmp);
dp[][] = store[].c;
minn[] = dp[][];
for(int i = ;i <= n;++i){
for(int j = ;j <= i;++j){
if(i == j) dp[i & ][j] = minn[i - ] + store[i].c;
else dp[i & ][j] = dp[(i - ) & ][j] + (store[i].x - store[j].x);
minn[i] = min(minn[i],dp[i & ][j]);
}
}
printf("%lld\n",minn[n]);
}
return ;
}

这里有一个特别坑的地方:标号小的教室坐标未必小,即这些教室不一定是从左到右标号的。

同时为了减少内存开销,我采用了滚动数组。

HDU 6024(中国大学生程序设计竞赛女生专场1002)的更多相关文章

  1. 2017中国大学生程序设计竞赛 - 女生专场 1002 dp

    Building Shops Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  2. 2017中国大学生程序设计竞赛 - 女生专场(dp)

    Building Shops Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) To ...

  3. 2017中国大学生程序设计竞赛 - 女生专场 Deleting Edges(思维+最短路)

    Deleting Edges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  4. 2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)

    Happy Necklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  5. 2017中国大学生程序设计竞赛 - 女生专场(Graph Theory)

    Graph Theory Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)To ...

  6. 2017中国大学生程序设计竞赛 - 女生专场B【DP】

    B HDU - 6024 [题意]:n个教室,选一些教室建造糖果商店. 每个教室,有一个坐标xi和在这个教室建造糖果商店的花费ci. 对于每一个教室,如果这个教室建造糖果商店,花费就是ci,否则就是与 ...

  7. hdu_5705_Clock("巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5705 题意:给你一个时间和一个角度,问你下一个时针和分针形成给出的角度是什么时候 题解:我们可以将这个 ...

  8. hdu_5707_Combine String("巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5707 题意:给你三个字符串 a,b,c,问你 c能否拆成a,b,a,b串的每一个字符在c中不能变 题解 ...

  9. 2017中国大学生程序设计竞赛 - 女生专场C【前后缀GCD】

    C HDU - 6025 [题意]:去除数列中的一个数字,使去除后的数列中所有数字的gcd尽可能大. [分析]: 数组prefixgcd[],对于prefixgcd[i]=g,g为a[0]-a[i]的 ...

随机推荐

  1. 老李分享:MySql的insert语句的性能优化方案

    老李分享:MySql的insert语句的性能优化方案   性能优化一直是测试人员比较感兴趣的内容,poptest在培训学员的时候也加大了性能测试调优的方面的内容,而性能优化需要经验的积累,经验的积累依 ...

  2. 手机自动化测试:appium源码分析之bootstrap八

    手机自动化测试:appium源码分析之bootstrap八   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣, ...

  3. Uva 11076 Add Again (数论+组合数学)

    题意:给你N个数,求把他们的全排列加和为多少 思路:对于这道题,假设数字k1在第一位,然后求出剩下N-1位的排列数num1,我们就可以知道k1在第一位时 排列有多少种为kind1, 同理,假设数字k2 ...

  4. Hibernate(二)之Hibernate-api详解

    一.Hibernate体系结构 二.Hibernate-api详解 2.1.Configuration配置对象 Configuration是用来加载配置文件的 我们Hibernate中主要有两个配置文 ...

  5. JavaScript引用是如何工作的

    原文链接:https://www.sitepoint.com/how-javascript-references-work/ 摘要:JavaScript中没有指针,并且JavaScript中的引用与我 ...

  6. Java虚拟机创建对象的内存分配以及对象的内存布局

    本博文知识参考周志明<深入理解Java虚拟机> Java虚拟机在创建对象使如果进行内存分配: 1.指针碰撞 2.空闲列表 Java在多线程情况下创建对象的内存分配: Java完成对象内存分 ...

  7. Java 原始数据类型

    如何记住 Java 中的原始数据类型? 画了一个图方便记忆:

  8. HTML在网页中插入音频视频简单的滚动效果

    每次上网,打开网页后大家都会看到在网页的标签栏会有个属于他们官网的logo,现在学了HTML了,怎么不会制作这个小logo呢,其实很简单,也不需要死记硬背,每当这行代码出现的时候能知道这是什么意思就o ...

  9. CF #299 div1 B. Tavas and Malekas KMP-next数组

    题目链接:http://codeforces.com/contest/536/problem/B 一个原始字符串,一个未知字符串,每一次从pos[i]开始覆盖未知字符串,问最后字符串的形式,以及判断过 ...

  10. JS理解之闭包

    首先,闭包是什么?这个问题,百度上一大堆,然后我也是,现在学的有点累,来回顾一下吧算是,懂的自动略过,小弟不才,道行入不了你们法眼. 我认为的闭包是,就是取到,不是在自己作用域内或者按照js的规则,娶 ...