原题

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. SGU 210 Acdream 1227 Beloved Sons KM

    题目链接:点击打开链接 题意: 给定n个人 每一个人的点权 以下n行i行表示第i个人能够获得哪些数(数字从1-n.且不能反复分配) 若这个人获得了数字则你能够获得他的权值. 要你能获得的权值和最大. ...

  2. BZOJ4479 [JSOI2013] 吃货jyy 解题报告(三进制状态压缩+欧拉回路)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4479 Description [故事背景]作为JSOI的著名吃货,JYY的理想之一就是吃 ...

  3. mysql if使用实例

    //DELIMITER DROP PROCEDURE if EXISTS createAmountCount; create PROCEDURE createAmountCount() BEGIN D ...

  4. 机器学习(七) PCA与梯度上升法 (上)

    一.什么是PCA 主成分分析 Principal Component Analysis 一个非监督学的学习算法 主要用于数据的降维 通过降维,可以发现更便于人类理解的特征 其他应用:可视化:去噪 第一 ...

  5. UI Framework-1: Native Controls

    Native Controls Background Despite the fact that views provides facilities for custom layout, render ...

  6. Python对象的循环引用问题

    目录 Python对象循环引用 循环引用垃圾回收算法 容器对象 生成容器对象 追踪容器对象 结束追踪容器对象 分代容器对象链表 何时执行循环引用垃圾回收 循环引用的垃圾回收 循环引用中的终结器 pyt ...

  7. MySQL好弱智的一个错误

    在sql中执行select是可以查询 但是在linux命令行下执行就报错 ERROR 1059 (42000): Identifier name 'use db_goforit_stati;selec ...

  8. 认识Vue组件

    前言 Vue.js是一套构建用户界面的渐进式框架(官方说明).通俗点来说,Vue.js是一个轻量级的,易上手易使用的,便捷,灵活性强的前端MVVM框架.简洁的API,良好健全的中文文档,使开发者能够较 ...

  9. 今日SGU 5.25

    SGU 194 题意:无源汇有上下界的最大流 收获:https://wenku.baidu.com/view/0f3b691c59eef8c75fbfb35c.html #include<bit ...

  10. IDEA使用GIT 上传到GitHub

    1.下载Git https://www.git-scm.com/download/ 2.安装 3.IDEA配置Git(设置Git路径,点击Test),如下代表成功 4.创建仓库 5.add 6.pus ...