BZOJ 1617 Usaco 2008 Mar. River Crossing渡河问题

【题解】

  显然是个DP题。

  设$f[i]$表示送$i$头牛过河所需的最短时间,预处理出$t[i]$表示一次性送i头牛过河所需时间,那么我们可以得到转移方程:$f[i]=min(f[i],f[i-j]+t[j]+t[0])$ (这里的$t[0]$指的是FJ独自过河的时间)

  这样就可以做一个$n$方的DP了

#include<cstdio>
#include<algorithm>
#define rg register
#define inf (1e9)
#define N (100010)
using namespace std;
int n,m,f[N],t[N];
inline int read(){
	int k=0,f=1; char c=getchar();
	while(c<‘0‘||c>‘9‘)c==‘-‘&&(f=-1),c=getchar();
	while(‘0‘<=c&&c<=‘9‘)k=k*10+c-‘0‘,c=getchar();
	return k*f;
}
inline int min(int x,int y){return x<y?x:y;}
int main(){
	n=read(); t[0]=read();
	for(rg int i=1;i<=n;i++) t[i]=read()+t[i-1];
	for(rg int i=1;i<=n;i++){
		f[i]=inf;
		for(rg int j=1;j<=i;j++) f[i]=min(f[i],f[i-j]+t[j]+t[0]);
	}
	printf("%d\n",f[n]-t[0]);
	return 0;
}

  

原文地址:https://www.cnblogs.com/DriverLao/p/8401222.html

时间: 2024-11-05 14:38:39

BZOJ 1617 Usaco 2008 Mar. River Crossing渡河问题的相关文章

BZOJ 1617: [Usaco2008 Mar]River Crossing渡河问题( dp )

dp[ i ] = max( dp[ j ] + sum( M_1 ~ M_( i - j ) ) + M , sum( M_1 ~ M_i ) ) ( 1 <= j < i )  表示运送 i 只羊的最少时间 , 转移很显然. T T 我自己第一次写时 , dp多带了个k表示第几次送牛过河 , 可是这并没有什么卵用..还 TLE 了... ------------------------------------------------------------------------- #in

[BZOJ1617][Usaco2008 Mar]River Crossing渡河问题

1617: [Usaco2008 Mar]River Crossing渡河问题 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1102  Solved: 801 [Submit][Status][Discuss] Description Farmer John以及他的N(1 <= N <= 2,500)头奶牛打算过一条河,但他们所有的渡河工具,仅仅是一个木筏. 由于奶牛不会划船,在整个渡河过程中,FJ必须始终在木筏上.在这个基础上,木筏上的奶牛数

BZOJ 1617 [Usaco2008 Mar]River Crossing渡河问题:dp

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1617 题意: Farmer John以及他的N(1 <= N <= 2,500)头奶牛打算过一条河,但他们所有的渡河工具,仅仅是一个木筏. 由于奶牛不会划船,在整个渡河过程中,FJ必须始终在木筏上. 在这个基础上,木筏上的奶牛数目每增加1,FJ把木筏划到对岸就得花更多的时间.当FJ一个人坐在木筏上,他把木筏划到对岸需要M(1 <= M <= 1000)分钟.当木筏搭载的奶牛

[Usaco2008 Mar]River Crossing渡河问题[简单DP]

Description 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)分钟才能把木

BZOJ 1597 Usaco 2008 Mar 土地购买 斜率优化DP

题目大意:给出一些木板,现在要购买这些木板.购买的规则是可以一些木板一起买,然后价格是最大的长度乘最大的宽度.求购买所有木板的最小费用. 思路:如果一个木板的长也比一个木板小,宽也比一个木板小,那么这个木板就可以被排除.把所有木板按照x的长度排序,然后去掉排除的木板,然后剩下的木板就是x值下降, y值上升的木板.这样的话我们买下连续的一段的费用就是x[j] * y[i],然后DP方程就很简单了:f[i] = f[j] - x[j + 1] * y[i]. 注意到数据范围,写一个斜率优化就水过了.

BZOJ 1617 Usaco River Crossing

一开始还以为是贪心,结果WA了一发. 才想到这是一个DP题目,子问题就是运送第i头牛时的最小花费. 那么转移方程也好表示. sum[i]表示前缀和  sum[0]表示单独一个人过河的时间m dp[i]=min(dp[i],dp[j]+sum[i-j]+sum[0]) #include <cstdio> #include <algorithm> #include <cstring> using std::min; int n,tot; int a[5005],dp[500

【BZOJ】【1597】【USACO 2008 Mar】土地购买

DP/斜率优化 Orz Hzwer…… 想到排序了,但没想到其实可以将序列转化为x递增且y递减的序列……因为x是递增的,若y[i]>y[i-1]那么第i-1个就足够小……以至于可以在搞定第 i 个的同时顺便带走…… 这次仔细写一下斜率优化的过程吧- 方程:$ f[i]=min\{ f[j]+x[i]*y[j+1] \} $ 若 $j>k$ 且 决策$j$更优,则有:\[ \begin{aligned} {f[j]+x[i]*y[j+1]} &<  {f[k]+x[i]*y[k+1

bzoj1597【USACO 2008 Mar】土地购买

1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3169  Solved: 1183 [Submit][Status][Discuss] Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000,000; 1 <= 长 <= 1,000,000). 每块

[BZOJ 1143][CTSC 2008]祭祀river(二分图最大独立集)

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1143 这是我做的第一道CTSC的题,这题水得我都惊呆了...据说BZOJ只有第一问,没有问第二问,因为没数据,难怪这么水... 首先我们得知道二分图的独立集的概念: 二分图的独立集是二分图中一个任意两点都不相连的顶点的集合 二分图的最大独立集求法: 二分图的最大独立集=二分图点数-二分图最大匹配 然后这题就好做了.首先我们用Floyd求出相互可达的点的点对,然后用这些点对建立一个