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 了... 

-------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
 
#define rep( i , n ) for( int i = 0 ;  i < n ; ++i )
#define clr( x , c ) memset( x , c , sizeof( x ) )
#define Rep( i , n ) for( int i = 1 ; i<= n ; ++i ) 
 
using namespace std;
 
const int maxn = 2500 + 5;
const int INF = int( 1e9 );
  

int sum[ maxn ];

int n;
int d[ maxn ];
 
int main() {
// freopen( "test.in" , "r" , stdin );
cin >> n;
cin >> sum[ 0 ];
Rep( i , n ) {
int t;
scanf( "%d" , &t );
sum[ i ] = sum[ i - 1 ] + t;
}
d[ 0 ] = 0;
Rep( i , n ) {
d[ i ] = sum[ i ];
for( int j = 1 ; j < i ; j++ )
   d[ i ] = min( d[ i ] , d[ j ] + sum[ i - j ] + sum[ 0 ] );
   
}
cout << d[ n ] << " ";
return 0;
}

------------------------------------------------------------------------- 

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

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 736  Solved: 526
[Submit][Status][Discuss]

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)分钟才能把木筏划过河(也就是说,船上有1头奶牛时,FJ得花M+M_1分钟渡河;船上有2头奶牛时,时间就变成M+M_1+M_2分钟。后面的依此类推)。那么,FJ最少要花多少时间,才能把所有奶牛带到对岸呢?当然,这个时间得包括FJ一个人把木筏从对岸划回来接下一批的奶牛的时间。

Input

* 第1行: 2个用空格隔开的整数:N 和 M

* 第2..N+1行: 第i+1为1个整数:M_i

Output

* 第1行: 输出1个整数,为FJ把所有奶牛都载过河所需的最少时间

Sample Input

5 10
3
4
6
100
1

输入说明:

FJ带了5头奶牛出门。如果是单独把木筏划过河,FJ需要花10分钟,带上
1头奶牛的话,是13分钟,2头奶牛是17分钟,3头是23分钟,4头是123分钟,将
5头一次性载过去,花费的时间是124分钟。


Sample Output

50

HINT

输出说明:


    Farmer John第一次带3头奶牛过河(23分钟),然后一个人划回来

(10分钟),最后带剩下的2头奶牛一起过河(17分钟),总共花费的时间是

23+10+17 = 50分钟。

Source

原文地址:https://www.cnblogs.com/JSZX11556/p/4556664.html