题目描述

桐爷人称计科老司机,有天要从深圳跑长途去帝都。桐爷的塞恩车每跑一千米耗油一升。塞恩车的油箱容量为200升。桐爷出发时有100升油,为了造成少耗油的假象到达帝都时至少有100升油。沿途有不少加油站,但是大多都是黑油站,油的价格差别大。桐爷心算了达帝都时的最小花费,请你也计算一下,看你是否能算对,有老司机的潜质。

输入

第一行是深圳到帝都的距离(小于10000千米),接着是不多于100个的黑油站的信息,按离深圳由近到远排列,包括油站到深圳的距离和每升油的价格(不超过2000)。

样例输入

500
100 999
150 888
200 777
300 999
400 1009
450 1019
500 1399

输出

桐爷到帝都的最小花费。如果不能按要求到达,输出Impossible

样例输出

450550

题解

一开始老师就跟我们说了这道题是线性动态规划,想了好久,想动态转移方程,后面发现这道题跟背包有点像。

动态转移方程如下:
dp[i][j] = min( dp[i][ j ] , dp[i-1][j+w-k ]+k*p[i] )这边的动态转移方程含义是:在第i个加油站加完k升油后具有j升油。

其中w为第i个油站和第i-1个油站之间的距离。

这边比较难理解的就是j+w-k,由于我已经说明j表示的是在第i个加油站加完油后的油量。那么j-k就代表到达第i个油站后尚未加油的状态,那么j-k+w就代表在第i-1个油站要出发往第i个油站的状态,也可简单理解为在第i-1个油站。

那么再次强调一下动态转移方程dp[i][j] = min( dp[i][ j ] , dp[i-1][j+w-k ]+k*p[i] )就表示我在第i个油站加油或不加油的最小话费金额。

注意由于油箱容量为200,所以任何时刻油量都不能超过200。

代码实现

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 1e9
int len,n=1;
int dp[100+5][200+5];
int dist[100+5];//第i个站的距离
int p[100+5];   //第i个站的价格int main(){cin >> len;for(n = 1; 2==scanf("%d%d",&dist[n],&p[n]);n++);n--;//初始状态dp中的元素初始为无穷大for(int i=0;i<=n;i++)for(int j=0;j<=200;j++)dp[i][j]=INF;/*出发点时,花费为0,注意出发时不是在第1个油站哦,出发点的下一个目标点才是油站,注意,第一个油站的下标值是从1开始的,不是0开始。*/dp[0][100]=0;//DP递推过程for(int i=1; i<=n; i++){//第i站与第i-1站的距离差值int w=dist[i]-dist[i-1];//j从0-200枚举,j表示在第i个油站出发时油的容量for(int j=0; j<=200; j++){//k表示在第i个油站加了多少油for(int k=0; k<=j; k++)/*j+w-k:在第i-1个油站出发的油量且其油量不能多于200(赛恩车油箱容量为200)*/if(j+w-k<=200 ){//加和不和的话费不同,我们选择话费较小的dp[i][j]=min(dp[i][j],dp[i-1][j+w-k]+k*p[i]);}}}/*解释一下下面的判断,由于dist数组存储的是深圳到油站的距离,len表示深圳到北京的距离,如果深圳到北京的距离-深圳到最后一个油站的距离大于100,那么桐爷就到不了北京了仔细思考一下,就能想明白的。(因为我们到北京时车里还需要有100升的汽油)*/if(len-dist[n]>100|| dp[n][100+len-dist[n]]==INF)printf("Impossible\n");else//能够到达北京,并且车里有100升油的最小花费。printf("%d\n",dp[n][100+len-dist[n]]);return 0;
}

桐爷开车 线性动态规划相关推荐

  1. 【动态规划】线性动态规划

    吐槽:动态规划这个东西,只要推不出状态转移方程,一切都白搭 基础知识 一. 动态规划 动态规划中最重要的三个概念:最优子结构,重复子问题,无后效性. 最优子结构:如果问题的最优解所包含的子问题的解也是 ...

  2. 第十七章:线性动态规划

    通过上一章对01背包问题的学习,我相信同学们都动态规划都有了一个新的认识.在我们利用动态规划解决问题的过程通常会有以下几个常见的专业术语,分别是:状态定义,状态的转移,初始化和边界条件.下面我们对这几 ...

  3. 动态规划之线性动态规划

    一.动态规划的定义以及术语 1.定义:将一个问题分解为子问题递归求解,并且将中间结果保存以避免重复计算的办法,就叫做"动态规划" 2.阶段:把求解问题的过程恰当地分成若干个相互联系 ...

  4. P2196 [NOIP1996 提高组] 挖地雷 线性动态规划DP 题解

    原题链接:[P2196 NOIP1996 提高组] 挖地雷 - 洛谷) 题目分析 看到这道题,首先感觉是个搜索,如果数据范围不大应该没问题.但是,,,我没找到数据范围啊喂~ 那就动态规划一下,先用二维 ...

  5. 线性动态规划-文件排版

    题目 写电子邮件是有趣的,但不幸的是经常写不好看,主要是因为所有的行不一样长,你的上司想要发排版精美的电子邮件,你的任务是为他编写一个电子邮件排版程序. 完成这个任务最简单的办法是在太短的行中的单词之 ...

  6. LeetCode198打家劫社(线性动态规划)

    题目链接:Leetcode198 Code: class Solution {public:int rob(vector<int>& nums) {//dp[i]表示偷盗到第i家获 ...

  7. 洛谷 1282 多米诺骨牌#线性动态规划#

    分析 状态转移方程:f[i+1][j+a[i]]=max(f[i][j]),f[i+1][j+b[i]]=max(f[i][j]+1)f[i+1][j+a[i]]=max(f[i][j]),f[i+1 ...

  8. (信息学奥赛一本通 1299)糖果#线性动态规划#

    题意:给出n个数,找出若干个数,使它们的和为k的倍数,并输出最大的数. 状态转移方程:f[i][j]表示前i个数%k=j的总数. f[i][j]=max(f[i-1][j],f[i-1][tmp]+a ...

  9. 【基础算法训练】—— 线性动态规划+位运算

    目录

最新文章

  1. a1708硬盘转接口_2015年A1502 Macbook Pro更换硬盘
  2. Windbg调试内核驱动方法
  3. onclick如何调用含参函数_在 golang 中如何调用私有函数(绑定隐藏的标识符)
  4. LPCTSTR和CString的关系
  5. 删除按钮_汪涵拜师学艺第七篇:往来单位查询删除按钮和新增判断的设计!
  6. win10开机之后任务栏卡住了怎么办
  7. 2021年游戏项目的十大编程语言:C++、Java、JavaScript、Python均在榜上
  8. office2010安装提示需要MSXML版本6.10.1129.0
  9. 2017找工作的经历,给求职小伙伴的一些建议
  10. 对于气缸型号表示的内容与与含义说明
  11. ffmpeg下载m3u8工具大全
  12. java swing paint_Java Paint未在Swing中绘制
  13. ReferenceError: xxx is not defined
  14. Java代码评审歪诗!让你写出更加优秀的代码!
  15. latex文件里面一个章节放的图表太多编译出现oo many unprocessed floats的解决方案
  16. 经济管理类的顶刊和核心整理
  17. 【刷题笔记】——day.6 有效的井字游戏
  18. 【最好用】remote desktop organizer 远程桌面管理工具的详细配置
  19. 【网关层】网关层及相关技术栈
  20. ESP8266开发之旅 网络篇⑦ TCP Server TCP Client

热门文章

  1. CSS 绝对定位 div 水平居中(两种)
  2. 【Error】 NotImplementedError raise NotImplementedError
  3. 从一次数据库会话阻塞根因诊断看全链路数据智能分析
  4. 美团面试之Hr面,不会套路把我坑惨了......
  5. Orchard core 新建项目
  6. [源码和文档分享]基于Win32 API实现的中国象棋游戏
  7. vue响应式系统--observe、watcher、dep
  8. 单选 a class.forname mysql_MySQL选择填空基础题
  9. html标签--隐藏域
  10. C++ 模拟键鼠详细总结