NYOJ_715_River Crossing【dp】

/*
River Crossing
時間限制:1000 ms  |  內存限制:65535 KB
難度:4

描述

    Afandi is herding N sheep across the expanses of grassland  when he finds himself blocked by a river. A single raft is available for transportation.
    Afandi knows that he must ride on the raft for all crossings, but adding sheep to the raft makes it traverse the river more slowly.

    When Afandi is on the raft alone, it can cross the river in M minutes When the i sheep are added, it takes Mi minutes longer to cross the river than with i-1 sheep (i.e., total M+M1   minutes with one sheep, M+M1+M2 with two, etc.).

    Determine the minimum time it takes for Afandi to get all of the sheep across the river (including time returning to get more sheep).

輸入
    On the first line of the input is a single positive integer k, telling the number of test cases to follow. 1 ≤ k ≤ 5 Each case contains:

    * Line 1: one space-separated integers: N and M (1 ≤ N ≤ 1000 , 1≤ M ≤ 500).

    * Lines 2..N+1: Line i+1 contains a single integer: Mi (1 ≤ Mi ≤ 1000)
輸出
    For each test case, output a line with the minimum time it takes for Afandi to get all of the sheep across the river.
樣例輸入
2    
2 10   
3
5
5 10  
3
4
6
100
1

樣例輸出

    18

    50

題意:有1個人和N只羊要過河。一個人單獨過河花費的時間是M,每次帶一隻羊過河花費時間M+M1,帶兩隻羊過河花費時間M+M1+M2……
給出N、M和Mi,問N只羊全部過河最少花費的時間是多少。
     題目中所給的Mi 不是指帶第i只羊 所需的時間,而是指 帶 i 只羊 所需時間。

#include <cstdio> 
#include <algorithm> 
using namespace std;
int dp[1005]; 
int main()  
{  
    int T, n, m;  
    scanf("%d", &T);  
    while(T--)  
    {  
    	int i,j;   
        scanf("%d %d", &n, &m);  
        int t;  dp[0] = m;
        for(i=1; i<=n; i++)  {  
            scanf("%d", &t);                   
            dp[i] = dp[i-1] + t;  
        }  
        for(i=1; i<=n; i++)  
            for(j=1; j<i; j++)  
                dp[i] = min(dp[i], dp[i-j]+dp[j]+m);  //比較 一次運,和 分成兩次運的情況 
        printf("%d\n", dp[n]);  
    }  
    return 0;  
} 


發佈了180 篇原創文章 · 獲贊 28 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章