护卫队

出自洛谷题库
https://www.luogu.com.cn/problem/P1594
【问题描述】 不是具体题目
大概就是有n个车要过河,只有一个桥(理论上只能单向通行,其实不用管对面),桥有最大承重,每次你可以把其中的任意一段(length<=n)辆车组成车队,同时通过。要求总时间的最小值。
【题目分析】
一开始我在摸索的时候,感觉这道题目有种多个01背包放在一起的感觉,因此,我开始脑补时间复杂度。。。要枚举有几个01背包,要枚举在哪里划分背包,然后还要多个01背包的O(n*n)的累加。。。
然后。。。正解
首先说,这是一道区间dp,这么说的原因是车辆的顺序给定(不能超车),所以我们只能枚举区间,因此,状态定义为二维,f[l][r],即区间左端,右端。
然后,状态转移方程就是在讨论区间的划分,取最小值。
初始化就是把f[i][i],第i辆车的通过时间直接求出来。
最后。。。注释很详细,建议复制到编译器里查看。
【代码+注释】->70分

#include <iostream>
#include <cmath>
#include <queue>   //不用加
#include <cstdio>
#include <vector>   //不用加
#include <cstring>
#include <algorithm>using namespace std;
const int MaxN=1000;     //固定常量定义数组上限  (水一下代码行数)
double f[MaxN+5][MaxN+5];  //dp数组
double w[MaxN+5][MaxN+5],t[MaxN+5][MaxN+5];  //存下任意区间的重量和以及通过时间( 预处理 );
struct group{double weight;double speed;
} a[MaxN+5];int main()
{double wmax,distance;int n;cin>>wmax>>distance>>n;for (int i=1;i<=n;i++) {cin>>a[i].weight>>a[i].speed;w[1][i]=w[1][i-1]+a[i].weight;  //相当于求前缀和,为后面的预处理作铺垫 t[i][i]=f[i][i]=distance/a[i].speed;    //求一下从第i到第i辆车的通过时间,即第i辆车的通过时间 (就单辆车而言,f数组与 t数组意义一样) }for (int i=1;i<=n;i++) {         //预处理 for (int j=i+1;j<=n;j++) {     //预处理不算作真正的区间dp,所以可以乱搞。。。求对就好 w[i][j]=w[1][j]-w[1][i-1];    //前缀和作差 t[i][j]=max(t[i][j-1],distance/a[j].speed);  //贪心 f[i][j]=1e18;   //本题要求最小值,先赋值最大值 }}for (int len=2;len<=n;len++) {        //枚举区间长度 for (int l=1;l+len-1<=n;l++) {    //枚举左端点,通过 len 求出右端点; int r=l+len-1;if (w[l][r]<=wmax) f[l][r]=t[l][r];   //这里意思是 :如果该区间本身就可以直接一起通过,自然不需要再讨论如何划分。直接最优。 else for (int k=l;k<r;k++) {      //注意区间左闭右开,不然 k+1>r 无意义 f[l][r]=min(f[l][r],f[l][k]+f[k+1][r]);    // 讨论划分方法}}    //值得注意的是,区间dp不能直接枚举左右端点,因为区间dp本质是从小区间推广到大区间,只能先从小长度来 (敲黑板) }printf("%.1lf\n",f[1][n]*60);return 0;
}

【优化方向】
可以考虑如下方向:

  1. 减少预处理的复杂度;
  2. 可以通过逆序循环来减少一个dp数组的维度;(如下)
  3. 简化决策;

【优化代码】->满分
这段代码是看过网上的文章后自己理解所写,无意抄袭

double ans[MaxN+5];    //前i辆车的通过时间最小值for (int i=1;i<=n;i++) ans[i]=1e18;for (int i=1;i<=n;i++) {for (int j=i;j>=1;j--) {   //相当于是枚举kif (w[i-j+1][i]<=wmax){ans[i]=min(ans[i],ans[i-j]+t[i-j+1][i]);}}} printf("%.1lf\n",ans[n]*60);

全文——终

洛谷1594 护卫队_区间dp_题解相关推荐

  1. 洛谷1594 护卫队

    洛谷1594 护卫队 本题地址: http://www.luogu.org/problem/show?pid=1594 题目描述 护卫车队在一条单行的街道前排成一队,前面河上是一座单行的桥.因为街道是 ...

  2. 洛谷1594 护卫队 (st算法)

    评测链接:http://www.luogu.org/problem/show?pid=1594 题目描述 Description 护卫车队在一条单行的街道前排成一队,前面河上是一座单行的桥.因为街道是 ...

  3. 洛谷1594 护卫队(动态规划) 解析

    题目 护卫车队在一条单行的街道前排成一队,前面河上是一座单行的桥.因为街道是一条单行道,所以任何车辆都不能超车.桥能承受一个给定的最大承载量.为了控制桥上的交通,桥两边各站一个指挥员.护卫车队被分成几 ...

  4. 洛谷P5520 [yLOI2019] 青原樱 题解

    洛谷P5520 [yLOI2019] 青原樱 题解 题目链接:P5520 [yLOI2019] 青原樱 题意: n n n 个空放 m m m 个物品,两两物品不能直接相邻,至少空一格 纯数学题. 看 ...

  5. 洛谷P4315 月下“毛景树” 题解

    洛谷P4315 月下"毛景树" 题解 题目链接:P4315 月下"毛景树" 题意:请维护一个数据结构,支持 改第 kkk 条边的边权 结点 uuu 到 vvv ...

  6. 洛谷P5633 最小度限制生成树 题解

    洛谷P5633 最小度限制生成树 题解 题目链接:P5633 最小度限制生成树 题意: 给你一个有 n n n 个节点, m m m 条边的带权无向图,你需要求得一个生成树,使边权总和最小,且满足编号 ...

  7. 洛谷P2619 [国家集训队]Tree I 题解

    洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...

  8. 洛谷P1282 多米诺骨牌 题解

    洛谷P1282 多米诺骨牌 题解 题目链接:P1282 多米诺骨牌 题意: 多米诺骨牌由上下 222 个方块组成,每个方块中有 1∼61\sim61∼6 个点.现有排成行的上方块中点数之和记为 S1S ...

  9. 洛谷P4084 [USACO17DEC]Barn Painting G 题解

    洛谷P4084 [USACO17DEC]Barn Painting G 题解 题目链接:P4084 [USACO17DEC]Barn Painting G 题意:题意:给定一颗N个节点组成的树,3种颜 ...

最新文章

  1. 一台机器同时启动两个tomcat
  2. Linux(CentOs6.4)安装Git
  3. JSONP跨域请求数据报错 “Unexpected token :”的解决办法
  4. 我是如何零基础入门前端开发的(2021 版)
  5. 马虎的算式子 (枚举法)
  6. leetcode python3 简单题206. Reverse Linked List
  7. 我不是九爷 带你了解 ansible
  8. stat /bin/bash: no such file or directory“: unknown.
  9. com.alibaba.dubbo.rpc.RpcException: Since you are
  10. Linux命令行连接WiFi
  11. 主板放电之后 mac 无法正常启动之谜
  12. 计算几何问题汇总--圆与矩形
  13. WORD中如何调整字间距
  14. “深度学习”和“多层神经网络”的区别
  15. mysql获取某个最大的值的一行数据_某一字段分组取最大(小)值所在行的数据
  16. 谷歌gmail注册入口_如何阻止Gmail将事件添加到Google日历
  17. 专业学习经验交流会成功举行
  18. Lua中如何判读number是偶数还是奇数
  19. mac SnailSVN如何拉取多个svn副本
  20. 解决Linux无法创建新用户和/home目录下无法创建新目录的问题,或者无权限创建用户目录问题mkdir: cannot create directory ‘ ’: Permissi

热门文章

  1. 第四节 结构化分析方法的概念
  2. 简化m文件转化为c/c++文件,VC编译
  3. SS00003.elasticsearch——|HadoopElasticSearch集中式日志分析系统.v03|——|Elasticsearch.v03|
  4. 美团技术团队前端安全系列
  5. linux python进入桌面,使用Linux桌面的几个尴尬问题
  6. 服务器硬盘7200转和15000,机械硬盘是不是转速参数越高就越好?看完本文你就不这么觉得了...
  7. maven的配置流程
  8. 从 jQuery 获取元素名(tagName)
  9. 推荐:移动应用开发的过去、现在和未来
  10. git撤销某个文件的修改