链接:http://www.rqnoj.cn/problem/87

思路:动态规划

定义f[i][j]表示到达第 i 块给定石头用了 j 块添加石头的最少步数。

转移方程:f[i][j]=min{f[k][j-tmp[pos[i]-pos[k]]+1]+tmp[pos[i]-pos[k]]} ,其中0<=k<i 且tmp[pos[i]-pos[k]]-1<=j

其中pos[i]表示第 i 块给定石头的坐标,tmp[i]表示跨过距离 i 需要添加的石头(相当于从坐标0出发到坐标 i ,注意坐标 i 处没有石头,需要放1块)。tmp[i]可以预处理出来,tmp[0]=0,tmp[i]=min{tmp[i-j]}+1,其中S<=j<=T且j<= i 。

最后统计答案,枚举最后落脚的给定石头 i 、用掉的石头 j 以及最后落脚的添加石头的位置 k (L-T+1<=k<=L且k>=pos[i]且j+tmp[k-pos[i]]<=M),ans=min{f[i][j]+tmp[k-pos[i]]+1} 。如果ans=INF即无法到达对岸,需要计算出能走的最远距离,那么枚举最后落脚的给定石头 i ,如果f[i][j]<INF,ans=max{pos[i]+(M-j)*T} 。

我的实现:

  1. 1 #include <iostream>
  2. 2 #include <cstdio>
  3. 3 #include <cstring>
  4. 4 using namespace std;
  5. 5 #define MaxL 100020
  6. 6 #define MaxN 120
  7. 7 #define MaxM 20020
  8. 8 #define INF 100020
  9. 9 int tmp[MaxL],pos[MaxN],f[MaxN][MaxM];
  10. 10 int L,N,M,S,T;
  11. 11 int ans;
  12. 12 inline void Get_int(int &Ret)
  13. 13 {
  14. 14 char ch;
  15. 15 bool flag=false;
  16. 16 for(;ch=getchar(),ch<'0'||ch>'9';)
  17. 17 if(ch=='-')
  18. 18 flag=true;
  19. 19 for(Ret=ch-'0';ch=getchar(),ch>='0'&&ch<='9';Ret=Ret*10+ch-'0');
  20. 20 flag&&(Ret=-Ret);
  21. 21 }
  22. 22 int main()
  23. 23 {
  24. 24 Get_int(L);Get_int(N);Get_int(M);Get_int(S);Get_int(T);
  25. 25 int i,j,k;
  26. 26 for(i=1;i<=N;++i)
  27. 27 Get_int(pos[i]);
  28. 28 memset(tmp,0x3f,sizeof(tmp));//预处理 tmp[i]表示距离i放的最少石头数
  29. 29 tmp[0]=0;
  30. 30 for(i=1;i<=L;++i)
  31. 31 for(j=S;j<=T&&i>=j;++j)
  32. 32 tmp[i]=min(tmp[i],tmp[i-j]+1);
  33. 33 memset(f,0x3f,sizeof(f));//边界
  34. 34 f[0][0]=0;
  35. 35 for(i=1;i<=N;++i)//dp f[i][j]表示到第i块给定石头用了j块添加石头的最少步数
  36. 36 for(j=0;j<=M;++j)
  37. 37 for(k=0;k<i;++k)
  38. 38 if(tmp[pos[i]-pos[k]]-1<=j)
  39. 39 f[i][j]=min(f[i][j],f[k][j-tmp[pos[i]-pos[k]]+1]+tmp[pos[i]-pos[k]]);
  40. 40 ans=INF;
  41. 41 for(i=0;i<=N;++i)//统计答案
  42. 42 for(j=0;j<=M;++j)
  43. 43 for(k=L;k>=L-T+1&&k>=pos[i];--k)
  44. 44 if(j+tmp[k-pos[i]]<=M)
  45. 45 ans=min(ans,f[i][j]+tmp[k-pos[i]]+1);
  46. 46 if(ans==INF)//计算最远到达的坐标
  47. 47 {
  48. 48 ans=0;
  49. 49 for(i=0;i<=N;++i)
  50. 50 for(j=0;j<=M;++j)
  51. 51 if(f[i][j]<INF)
  52. 52 ans=max(ans,pos[i]+(M-j)*T);
  53. 53 }
  54. 54 printf("%d\n",ans);
  55. 55 return 0;
  56. 56 }

效率:

[题解]RQNOJ PID87 过河的更多相关文章

  1. 【题解】p1809 过河问题

    原题传送门 题目分析 现有n个人在东岸,要过河去西岸.开始东岸有一艘船,船最多可承载2人,过河时间以耗时最长的人所需时间为准. 给定n个人的过河时间a,求所有人从东岸到西岸所需的最短时间. 当\(n= ...

  2. 题解 P1002 【过河卒】

    正文 简单描述一下题意: 士兵想要过河,他每一次可以往下走一格,也可以往右走一格,但马一步走到的地方是不能走的,问走到\(n\)行,\(m\)列有多少种走法 我们显然应该先根据马的位置将不能走的格子做 ...

  3. [题解]RQNOJ PID86 智捅马蜂窝

    链接:http://www.rqnoj.cn/problem/86 思路:单源点最短路 建图:首先根据父子关系连双向边,边权是距离/速度:再根据跳跃关系连单向边,边权是自由落体的时间(注意自由下落是一 ...

  4. [题解]RQNOJ PID85 三个袋子

    链接:http://www.rqnoj.cn/problem/85 思路:一个排列问题,递推式很简单,f(n+1)=3*f(n)-1 ,由此可以推出通项公式,f(n)=0.5*3^(n-1)+0.5 ...

  5. 题解 P1052 【过河】

    显然是\(dp\),是用\(STL\)当中的\(map\)可以做到30分 #include <bits/stdc++.h>//万能头文件 using namespace std; int ...

  6. luoguP1502过河题解

    日常吐(fei)嘈(hua) 这道题作为最近卡了我3天的dp题(最后还是在题解的帮助下冥思苦想才过掉的题),窝觉得此题肥肠之脑洞,写此博客纪念 题解 过河 先来日常手玩样例: 咦感觉怎么手玩答案都像是 ...

  7. 洛谷P1002 过河卒 题解 动态规划

    题目链接:https://www.luogu.com.cn/problem/P1002 题目大意 棋盘上\(A\)点有一个过河卒,需要走到目标\(B\)点.卒行走的规则:可以向下.或者向右.同时在棋盘 ...

  8. 【题解】洛谷P1002过河卒

    首先,一道入门DP 然而对于蒟蒻的我已经难到爆了好吗 第一点:动态转移方程 用DP的关键! 这题我们可以发现每一步的方案数由上面的那步加上左边的那步得到 所以自然而然的方程就出来了: f[i][k]= ...

  9. P1052 过河 题解

    复习dp(迪皮)的时候刷到了一道简单路径压缩的题目(一点不会qwq) 题目描述链接. 正解: 首先呢,我们看到题目,自然而然的会想到这种思路: 设状态变量dp[i]表示从第一个格子开始经过一些跳跃跳到 ...

随机推荐

  1. webstorm 配置git代码项目管理工具

    1.下载最新的webStrom11安装包安装 https://confluence.jetbrains.com/display/WI/Previous+WebStorm+Releases/ 2.破解w ...

  2. WPF使用MVVM(二)-命令绑定

    WPF使用MVVM(二)-命令绑定 上一节已经介绍了WPF的属性绑定,这使得我们只需要指定界面的DataContext,然后就可以让界面绑定我们的属性数据呢. 但是上一节还遗留了一个问题就是我们的按钮 ...

  3. golang中为何在同一个goroutine中使用无缓冲通道会导致死锁

    package main import "fmt" func main() { /* 以下程序会导致死锁 c := make(chan int) c <- 10 n1 := ...

  4. Tomcat-Tomcat服务器实例使用的其他细节说明

    1,修改工程访问路径 context修改路径 ,访问的地址也会改变成一致 2,修改运行的端口号 3,修改运行时使用的浏览器 4,配置资源热部署

  5. 集合框架-工具类-JDK5.0特性-函数可变参数

    1 package cn.itcast.p4.news.demo; 2 3 public class ParamterDemo { 4 5 public static void main(String ...

  6. 使用ansible 批量分发ssh密钥

    先看执行结果 看看ssh.yml怎么写的 看看hosts文件中backup组怎么写的

  7. Python:使用pyinstaller打包含有gettext locales语言环境的项目

    问题 如何使用 pyinstaller 打包使用了 gettext 本地化的项目,最终只生成一个 exe 文件 起因 最近在用 pyhton 做一个图片处理的小工具,顺便接触了一下 gettext,用 ...

  8. 关于https域名下的页面iframe嵌套http页面的问题

    业务场景:在一个https域名下用iframe嵌套一个http域名的页面,会直接报错的,报错信息如下: 这段话的意思是:http域名的页面是通过https域名页面加载的,在一个安全的页面不允许加载一个 ...

  9. 浅谈AngularJS中使用$resource

    这个服务可以创建一个资源对象,我们可以用它非常方便地同支持RESTful的服务端数据源进行交互,当同支持RESTful的数据模型一起工作时,它就派上用场了. REST是Representational ...

  10. art 模式 android runtime

    空间换时间的概念. art:程序在安装时需要预编译读取,将代码转换为机器码 好处:程序运行时,无需时时转换,运行速度快 : 缺点:安装时间稍长,由于转换机器码,所以占用略高的存储空间.