【bzoj1617】[Usaco2008 Mar]River Crossing渡河问题 dp
2024-10-21 10:09:01
题目描述
Farmer John以及他的N(1 <= N <= 2,500)头奶牛打算过一条河,但他们所有的渡河工具,仅仅是一个木筏。 由于奶牛不会划船,在整个渡河过程中,FJ必须始终在木筏上。在这个基础上,木筏上的奶牛数目每增加1,FJ把木筏划到对岸就得花更多的时间。 当FJ一个人坐在木筏上,他把木筏划到对岸需要M(1 <= M <= 1000)分钟。当木筏搭载的奶牛数目从i-1增加到i时,FJ得多花M_i(1 <= M_i <= 1000)分钟才能把木筏划过河(也就是说,船上有1头奶牛时,FJ得花M+M_1分钟渡河;船上有2头奶牛时,时间就变成M+M_1+M_2分钟。后面的依此类推)。那么,FJ最少要花多少时间,才能把所有奶牛带到对岸呢?当然,这个时间得包括FJ一个人把木筏从对岸划回来接下一批的奶牛的时间。
输入
* 第1行: 2个用空格隔开的整数:N 和 M
* 第2..N+1行: 第i+1为1个整数:M_i
输出
* 第1行: 输出1个整数,为FJ把所有奶牛都载过河所需的最少时间
样例输入
5 10
3
4
6
100
1
样例输出
50
题解
dp
f[i]表示运完前i头牛后返回的最小时间。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int sum[2501] , f[2501];
int main()
{
int n , m , i , j , t;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++ )
{
scanf("%d" , &t);
sum[i] = sum[i - 1] + t;
}
memset(f , 0x7f , sizeof(f));
f[0] = 0;
for(i = 1 ; i <= n ; i ++ )
for(j = 0 ; j < i ; j ++ )
f[i] = min(f[i] , f[j] + 2 * m + sum[i - j]);
printf("%d\n" , f[n] - m);
return 0;
}
最新文章
- 第1章Java入门体验
- 请求WebMethod, Ajax 处理更加专注
- Retina视网膜屏中CSS3边框图片像素虚边的问题
- RPC框架Thrift例子-PHP调用C++后端程序
- 对不起,说句粗话——这个太屌了,windows1.0安装程序(附下载)
- 上下文菜单与TrackPopupMenu
- Python2 中文编码处理
- 如何架构一个合适的企业API网关
- Django 加载 app 中的urls
- JavaScript栈和队列
- altium designer 制作内部不铺铜的封装,如三极管下面禁止铺铜
- Context家族
- windows下一分钟配置ngnix实现HLS m3u8点播
- 程序员大佬推荐的java学习路线
- python的十进制与任意进制的转换
- POJ 1166 暴力搜索 即 枚举
- 四、java面向对象编程_2
- Smack 广播
- Linux route命令
- [典型漏洞分享]结合YS业务分析使用oauth协议的风险
热门文章
- Nginx初体验(一):nginx介绍
- 【BZOJ3611】大工程(虚树,动态规划)
- Android:Gradle报错——No resource found that matches the given name (at &#39;dialogCornerRadius&#39; with value &#39;?android:attr/dialogCornerRadius&#39;)
- P/Invoke 光标的操作
- OSG-阴影
- HTML+JS = 网站注册界面源代码
- 百度翻译api 实现简易微信翻译小程序
- jetbrains系列激活
- NMAP-高级用法
- Coins and Queries(map迭代器+贪心)