原题

LRJ入门经典-0907万圣节的小L306
难度级别:B; 运行时间限制:1000ms; 运行空间限制:256000KB; 代码长度限制:2000000B
试题描述

今天是万圣节,小L同学开始了一年一度的讨要糖果游戏,但是在刚刚过去的比赛中小有成就的他打算给自己增加一点难度:如果没有讨到每一家的糖果就算输。

已知小L共有n(n不大于10000)个邻居,他们都在同一条街上(可以近似看成一条直线),第i个邻居的坐标是xi。L同学的妈妈会在一开始把他送到任意邻居的门前。现在已知所有邻居会在di时间后休息(休息以后不能再去打扰),求访问完所有点的最短时间,如果无解输出“No solution”。

输入
输入第一行为一个正整数表示n,接下来n行,每行两个用空格隔开的数,分别表示第i个邻居的位置和休息时间。
输出
输出一个数,表示最短时间,无解输出“No solution”。
输入示例
5
1 3
3 1
5 8
8 19
10 15
输出示例
11

分析1

当一看到“(n不大于10000)”时,就大约知道这是一道动态规划了。

再一看到“(可以近似看成一条直线)”时,就大概知道这是一道区间DP

一切的一切都在说明一件事:读题很重要(语文很重要)。

状态:

dp[i][j][0]:将第i~j户邻居的糖果在他们休息之前全部要到,并在最后停在左边的最短时间。
dp[i][j][1]:将第i~j户邻居的糖果在他们休息之前全部要到,并在最后停在的最短时间。

转移方程:

这个可能有点难:

x=dp[i][j-1][1]+a[j]-a[j-1];

y=dp[i][j-1][0]+a[j]-a[i];

if(x>b[j]) x=INF;

if(y>b[j]) y=INF;

dp[i][j][1]=min(dp[i][j][1],min(x,y));

x=dp[i][j-1][0]+a[j]-a[j-1];

y=dp[i][j-1][1]+a[j]-a[i];

if(x>b[j]) x=INF;

if(y>b[j]) y=INF;

dp[i][j][0]=min(dp[i][j][0],min(x,y));

答案:

很显然是min(dp[1][n][0],dp[1][n][1])。

代码1

先上一段错误的代码:

分析2

显然上段代码的dp数组开不下了!

不要慌!

冷静思考!

首先想解决办法:

1、(谁都能想到)压缩数组

2、(这个有点儿难)用滚动数组

将dp[i][j][k]的i压缩成2

直接上代码!

代码2

#include<iostream>
#include<cstring>
#include<algorithm>
#define INF 1073741824
using namespace std;
int dp[2][10001][2],n;
int a[10001],b[10001];
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i]>>b[i];
for(int i=1;i<=n;i++) dp[0][i][0]=dp[1][i][1]=0;
for(int k=1;k<n;k++)
{
for(int i=1;i+k<=n;i++)
{
int j=i+k,x,y;
int I=(i%2)^1;
dp[i%2][j][0]=dp[i%2][j][1]=INF;
x=dp[i%2][j-1][1]+a[j]-a[j-1];y=dp[i%2][j-1][0]+a[j]-a[i];
if(x>b[j]) x=INF;
if(y>b[j]) y=INF;
dp[i%2][j][1]=min(dp[i%2][j][1],min(x,y));
//cout<<"i:"<<i<<" j:"<<j<<" o:1"<<" x:"<<x<<" y:"<<y<<" dp:"<<dp[i%2][j][1]<<endl;
x=dp[I][j][0]+a[i+1]-a[i];y=dp[I][j][1]+a[j]-a[i];
if(x>b[i]) x=INF;
if(y>b[i]) y=INF;
dp[i%2][j][0]=min(dp[i%2][j][0],min(x,y));
//cout<<"i:"<<i<<" j:"<<j<<" o:0"<<" x:"<<x<<" y:"<<y<<" dp:"<<dp[i%2][j][0]<<endl<<endl;
}
}
if(min(dp[1][n][0],dp[1][n][1])==INF) cout<<"No solution";
else cout<<min(dp[1][n][0],dp[1][n][1]);
return 0;
}

  

LRJ入门经典-0907万圣节的小L306的更多相关文章

  1. LRJ入门经典-0905邮票和信封305

    原题 LRJ入门经典-0905邮票和信封305 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 假定一张信封最多贴5张邮票,如 ...

  2. LRJ入门经典-0906最短公共父串305

    原题 LRJ入门经典-0906最短公共父串305 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 给定字符串A和字符串B,要求 ...

  3. LRJ入门经典-0903切蛋糕305

    原题 LRJ入门经典-0903切蛋糕305 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 如图所示有一个矩形蛋糕,上面划分成 ...

  4. C++语言学习——LRJ入门经典笔记

    1.scanf的输入格式,空格.TAB和回车符都是无关紧要,所以按Enter键并不意味着输入结束. 告诉程序输入结束的方式: 在windows下,输入完毕后先按Enter键,再按Ctrl+Z键,最后再 ...

  5. [刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-10/UVa1587:Box 代码: //UVa1587 - Box #include&l ...

  6. [刷题]算法竞赛入门经典 3-7/UVa1368 3-8/UVa202 3-9/UVa10340

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 都是<算法竞赛入门经典(第二版)>的题目,标题上没写(第二版) 题目:算法竞赛入门经典 3-7/UVa13 ...

  7. [刷题]算法竞赛入门经典 3-1/UVa1585 3-2/UVa1586 3-3/UVa1225

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO(我也是在网上找到的pdf,但不记得是从哪里搜刮到的了,就重新上传了一遍) PS:第一次写博客分享我的代码,不知道我对c ...

  8. [转][RabbitMQ+Python入门经典] 兔子和兔子窝

    [转][RabbitMQ+Python入门经典] 兔子和兔子窝 http://blog.csdn.net/linvo/article/details/5750987 RabbitMQ作为一个工业级的消 ...

  9. 【推荐图书】+ 基于Nios II的嵌入式SoPC系统设计与Verilog开发实例+C#入门经典等

    [推荐图书]+ 基于Nios II的嵌入式SoPC系统设计与Verilog开发实例+C#入门经典等 3赞 发表于 2016/7/4 21:14:12 阅读(1921) 评论(3) 初次接触FPGA,到 ...

随机推荐

  1. 上传canvas图片到服务器

    canvas绘图后用 canvasDom.toDataURL()可以得到png格式图片的base64 dataURI 然后用ajax post给后台  ,后端程序把开头的data:image/png; ...

  2. List operations

    The + operator concatenates lists: Similarly, the * operator repeats a list a given number of items: ...

  3. 关键字super

    1.super,相较于关键字this,可以修饰属性.方法.构造器 2.super修饰属性.方法:在子类的方法.构造器中,通过super.属性或者super.方法的形式,显式的调用父类的指定 属性或方法 ...

  4. CUDA中的归约

    CUDA编程实战书中的乘方和解决办法: 对一个数组执行某种计算,然后产生一个更小的结果数组. 由一个线程在共享内存上进行迭代并计算出总和值.而如果用并行,所花时间就与数组长度的对数成正比. 代码的思想 ...

  5. PostgreSQL Replication之第五章 设置同步复制(1)

    到目前为止,我们已经处理了基于文件的复制(或日志传送)和简单的基于流复制的设置.在两种情况中,在master上事务被提交之后,数据被提交,由slave接收.在master提交和slave实际上完全地接 ...

  6. DELL T430进RAID的方式:, 硬盘损坏后的处理方式

    **DELL T430 新机安装2块硬盘后进RAID的方式: ** 一. BIOS更改 1.改启动方式为RAID mode  : 开机按F2进入BIOS 界面 --->System BIOS - ...

  7. input的选中与否以及将input的value追加到一个数组里

    html布局 <div class="mask"> //每一个弹层都有一个隐藏的input <label> <input hidden="& ...

  8. NodeJS学习笔记 进阶 (5)将图片转成datauri嵌入到html(ok)

    个人总结:这篇文章讲解了使用Node处理转换base64编码图片,读完这篇文章需要5分钟. 摘选自网络 问题:将图片转成datauri 今天,在QQ群有个群友问了个问题:“nodejs读取图片,转成b ...

  9. luoguP1462通往奥格瑞玛的道路(二分答案+spfa)

    题意 给出n个点m条边的无向图. 每条边有两个权值a,b; 问在保证从1到n的路径a权值和小于x时,路径上b权值最大值最小为多少. (n≤10000,m≤50000,x≤1000000000) 题解 ...

  10. 开源映射平台Mapzen加入了Linux基金会的项目

    2019年1月29日,Linux基金会宣布,开源映射平台Mapzen现在是Linux基金会项目的一部分. Mapzen专注于地图显示的核心组件,如搜索和导航.它为开发人员提供了易于访问的开放软件和数据 ...