奶牛渡河

题目描述

\(Farmer John\) 以及他的 \(N (1\leq N\leq 2500)\) 头奶牛打算过一条河,但他们所有的渡河工具,仅仅是一个木筏。

由于奶牛不会划船,在整个渡河过程中,\(Farmer John\) 必须始终在木筏上。在这个基础上,木筏上的奶牛数目每增加 \(1\) ,\(Farmer John\) 把木筏划到对岸就得花更多的时间。

当\(Farmer John\) 一个人坐在木筏上,他把木筏划到对岸需要\(M (1\leq M\leq 1000)\)分钟。

当木筏搭载的奶牛数目从 \(i-1\) 增加到 \(i\) 时,\(Farmer John\)得多花 \(M_i (1\leq M_i\leq 1000)\) 分钟才能把木筏划过河。

也就是说,船上有 \(1\) 头奶牛时,\(Farmer John\) 得花 \(M+M_1\) 分钟渡河;船上有 \(2\) 头奶牛时,时间就变成 \(M+M_1+M_2\) 分钟。后面的依此类推。

那么,\(Farmer John\) 最少要花多少时间,才能把所有奶牛带到对岸呢?当然,这个时间得包括 \(Farmer John\) 一个人把木筏从对岸划回来接下一批的奶牛的时间。

输入格式

第 \(1\) 行: \(2\) 个用空格隔开的整数:\(N\) 和 \(M\) ;

第 \(2...N+1\) 行: 第 \(i+1\) 为 \(1\) 个整数: \(M_i\) ;

输出格式

第 \(1\) 行: 输出 \(1\) 个整数,为\(Farmer John\)把所有奶牛都载过河所需的最少时间;

样例

样例输入

5 10
3
4
6
100
1

样例输出

50

题目大意:

载船运牛,每载一头牛,运送时间越长,求最短的运送时间。

注意

\(①\) 注意回来的时间。

\(②\) \(M_i\) 指的是船上有 \(i\) 头牛时,增加 \(M_i\) 的时间,而不是第 \(i\) 头牛运的时候需要 \(M_i\) 的时间。

\(③\) 注意加上 \(m\) 本身。

思路

求数组的前缀和,使 \(M_i\) 的值代表船上有 \(i\) 头牛时,运送需要的时间。

决策:直接把这 \(i\) 头牛运过去;

   或者先把 \(j\) 头牛运过去,回来在把剩下的 \(i-j\) 头牛运过去。

动态方程:\(dp[i]=min(dp[i],dp[j]+cow[i-j]+m)\)

代码

#include <bits/stdc++.h>
using namespace std; const int maxn=5000+50;
int n,m;
int Cow[maxn],dp[maxn]; int main(){
cin>>n>>m;
    Cow[0]=m;//算上木筏的时间
    for(int i=1;i<=n;i++){
cin>>Cow[i];
Cow[i]+=Cow[i-1];//求前缀和,便于计算
}
for(int i=1;i<=n;i++){
dp[i]=Cow[i];//初始化
for(int j=0;j<i;j++){
dp[i]=min(dp[i],dp[j]+Cow[i-j]+m);//决策
}
}
cout<<dp[n]<<endl;
return 0;
}

奶牛渡河——线性dp的更多相关文章

  1. 奶牛渡河(dp)

    奶牛渡河 时间限制: 1 Sec  内存限制: 128 MB提交: 36  解决: 27[提交][状态][讨论版][命题人:外部导入][Edit] [TestData] [同步数据] 题目描述 Far ...

  2. 洛谷2344 奶牛抗议(DP+BIT+离散化)

    洛谷2344 奶牛抗议 本题地址:http://www.luogu.org/problem/show?pid=2344 题目背景 Generic Cow Protests, 2011 Feb 题目描述 ...

  3. LightOJ1044 Palindrome Partitioning(区间DP+线性DP)

    问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...

  4. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  5. hdu1712 线性dp

    //Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...

  6. 动态规划——线性dp

    我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...

  7. POJ 2479-Maximum sum(线性dp)

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33918   Accepted: 10504 Des ...

  8. poj 1050 To the Max(线性dp)

    题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...

  9. nyoj44 子串和 线性DP

    线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...

随机推荐

  1. java代码(13) ---Predicate详解

    Predicate详解 遇到Predicate是自己在自定义Mybatis拦截器的时候,在拦截器中我们是通过反射机制获取对象的所有属性,在查看这些属性上是否有我们自定义的UUID注解 如果有该注解,那 ...

  2. TZOJ 车辆拥挤相互往里走

    102路公交车是crq经常坐的,闲来无聊,他想知道最高峰时车上有多少人,他发现这辆车只留一个门上下人,于是他想到了一个办法,上车时先数一下车上人员数目(crq所上的站点总是人不太多),之后就坐在车门口 ...

  3. Linux目录处理命令mkdir详解

    mkdir(英文原意:make directories),基本作用是创建新的目录,命令的路径及权限: 可以看到,这个命令的路径是/usr/bin/mkdir,所以它的执行权限是所有用户 mkdir 创 ...

  4. Mac下如何连接linux服务器(SSH)-比较好用的SSH工具推荐

    Mac下如何连接linux服务器(SSH) 1.用mac自带终端连接 步骤如下: 打开终端,在顶部shell菜单中选择新建远程连接 在右侧服务器窗口点击+号,添加服务器,输入IP等信息 输入用户名,点 ...

  5. 阿里巴巴 《Java 开发者手册》+ IDEA编码插件

    4月22日,阿里巴巴发布了泰山版<Java 开发手册>,以前以为终极版就真的是终极版了,没想到还是想的太简单了,继终极版之后又发布了详尽版.华山版,这不,泰山版又来了.想想也对,行业一直在 ...

  6. 【大厂面试04期】讲讲一条MySQL更新语句是怎么执行的?

    流程图 这是在网上找到的一张流程图,写的比较好,大家可以先看图,然后看详细阅读下面的各个步骤. 执行流程: 1.连接验证及解析 客户端与MySQL Server建立连接,发送语句给MySQL Serv ...

  7. webpack+vue+.vue组件模板文件 所需要的包

    {  "name": "webpack-study02",  "version": "1.0.0",  "de ...

  8. 【雕爷学编程】MicroPython动手做(08)——零基础学MaixPy之识别颜色

    早上用百度搜了一下“颜色识别”,多少有了一点大致的概念,还是老办法,动手做,多实验,往前走,还请各位老师多多指点. OpenCV(百度百科)是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运 ...

  9. STL容器操作

    目录 1. 数组 2. Vector 3. List 3.1. std::forward_list 4. Tuple 4.1. 运行期索引 4.2. 元组合并 4.3. 元祖遍历 5. Pair 6. ...

  10. 数据结构之栈(Stack)

    什么是栈(Stack) 栈是一种遵循特定操作顺序的线性数据结构,遵循的顺序是先进后出(FILO:First In Last Out)或者后进先出(LIFO:Last In First Out). 比如 ...