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

    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分钟。

     dp。f[i][0]表示把i头牛送到对岸不返回的最小代价。f[i][1]表示把i头牛送到对岸返回的最小代价。预处理读入的时候a[i]表示带i头奶牛过河的时间。dp方程:f[i][0]=min(a[i],f[j][1]+a[i-j])。f[i][1]=f[i][0]+m。

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int a[3000];
    int f[3000][2];
    int main()
    {
    int n,m;
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
     {scanf("%d",a+i);if(i==1)a[i]+=m;a[i]+=a[i-1];}
    for (int i=1;i<=n;i++)
     {
    f[i][0]=a[i];
    for(int j=1;j<i;j++)
     f[i][0]=min(f[i][0],f[j][1]+a[i-j]);
    f[i][1]=f[i][0]+m;
     }
    cout<<f[n][0];
    } 
    
    ——by zhber,转载请注明来源
  • 相关阅读:
    leetcode 673. 最长递增子序列的个数 java
    leetcode 148. 排序链表 java
    leetcode 98. 验证二叉搜索树 java
    leetcode 29. 两数相除 java
    leetcode 234. 回文链表 java
    Valid Palindrome LeetCode Java
    Single Number II LeetCode Java
    Single Number LeetCode java
    Search in Rotated Sorted Array II LeetCode Java
    Search in Rotated Sorted Array leetcode java
  • 原文地址:https://www.cnblogs.com/zhber/p/4036112.html
Copyright © 2011-2022 走看看