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


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

    Time Limit: 5 Sec  Memory Limit: 64 MB
    Submit: 1095  Solved: 795
    [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

    Analysis

    定义状态DP[ 前 i 头牛 ][ 共 j 趟 ]

    于是我们得到一个O(n4)的DP!

    qwq

    正解是DP[ 前 i 头牛 ],保存最少时间

    DP[ j ] = DP[ i ] + 2*m + sum[ j-i ]

    刚开始的时候当然保存的都是一趟来回的时间(这样才方便min啊)

    Code

     1 #include<cstdio>
     2 #include<iostream>
     3 #define maxn 1000000
     4 using namespace std;
     5 
     6 int DP[maxn],sum[maxn],n,m;
     7 
     8 int main(){
     9     scanf("%d%d",&n,&m);
    10     
    11     for(int i = 1;i <= n;i++){
    12         scanf("%d",&sum[i]);
    13         sum[i] += sum[i-1];
    14         DP[i] = sum[i]+m;
    15     }
    16     
    17     
    18     
    19     for(int i = 1;i <= n;i++){
    20         for(int j = i+1;j <= n;j++){
    21             DP[j] = min(DP[j],DP[i]+sum[j-i]+2*m);
    22         }
    23     }
    24     
    25     printf("%d
    ",DP[n]);
    26     
    27 //    for(int i = 1;i <= n;i++) printf("%d ",DP[i]);
    28     
    29     return 0;
    30 }
    qwq
    转载请注明出处 -- 如有意见欢迎评论
  • 相关阅读:
    Timestamp (rowversion) Data Type
    replace(/\s/g,"")中的/g是什么意思? 及replace函数的用法
    取消ie6自动打开excel
    C#日期函数使用大全
    Photoshop制作Favicon.ico图标(转载)
    为什么就没有中文版 数据库设计和优化 的书呢
    C#操作Access的一些小结
    asp.net 下发布水晶报表调试经验
    ASREP Roasting & Kerberoast
    重新点亮linux 基本软件————防火墙[一]
  • 原文地址:https://www.cnblogs.com/Chorolop/p/7463065.html
Copyright © 2020-2023  润新知