zoukankan      html  css  js  c++  java
  • 【bzoj1617】[Usaco2008 Mar]River Crossing渡河问题 dp

    题目描述

    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
    " , f[n] - m);
        return 0;
    }
  • 相关阅读:
    scala之伴生对象的继承
    scala之伴生对象说明
    “Failed to install the following Android SDK packages as some licences have not been accepted” 错误
    PATH 环境变量重复问题解决
    Ubuntu 18.04 配置java环境
    JDBC的基本使用2
    DCL的基本语法(授权)
    ZJNU 1374
    ZJNU 2184
    ZJNU 1334
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/6278764.html
Copyright © 2011-2022 走看看