2011-06-10 19:42:18Morris

d832. 遊樂場

http://zerojudge.tw/ShowProblem?problemid=d832

內容 :

遊樂場裡有一個遊戲:桌上放著 n 顆球,每顆球裡面閃亮亮著一個數字,有正有負,有些則是 0。
老闆說,這個遊戲可以一個人玩,也可以兩個人玩。
於是你開開心心地拉住朋友,跟老闆說要兩個人一起玩,
老闆說,請你先從這 n 個球中拿走連續的一些球,
然後再由你的朋友從剩下的球裡,同樣拿走連續的一些球。
接下來,你們手上的球的數字的總和,就是你們可以得到的獎金。

舉例來說,如果這一字排開的球上的數字是:
-3 5 6 7 -9 2 -1 4 3
那麼,可以得到最多獎金的拿法如下:
-3 (5 6 7) -9 [2 -1 4 3]
其中 [ ] 是你拿的球,而 ( ) 則是你朋友拿走的球,你們共可以得到 26 單位的獎金。

注意,你或你朋友當然可以什麼都不拿。

輸入說明 :

有多組測試資料,以 EOF 結束。

每組測試資料的第一行有兩個正整數 n (n<=10000) 和 m (m<2147483648),
分別表示桌上的球的數量,以及玩這個遊戲必須預先支付給老闆的錢。
接下來有 n 個數字,每個數字的絕對值不會超過 1000。

輸出說明 :

輸出一個數字,表示你和你的朋友,能拿到的最高獎金是多少。

範例輸入 :

9 100
-3 5 6 7 -9 2 -1 4 3
5 38
1 2 3 4 5

範例輸出 :

26
15

提示 :

出處 :

(管理:shik)

作法 : DP
求兩段的 "連續元素和",總和最大
http://www.cppleyuan.com/viewthread.php?tid=1240

/**********************************************************************************/
/*  Problem: d832 "遊樂場" from                                                */
/*  Language: C                                                                   */
/*  Result: AC (3ms, 408KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-06-04 21:21:25                                     */
/**********************************************************************************/


#include<stdio.h>
main() {
    int n, m, a, b;
    while(scanf("%d %d", &n, &m) == 2) {
        int A[10001] = {};
        for(a = 0; a < n; a++)
            scanf("%d", &A[a]);
        int max[2][10001] = {}, mmax[10001] = {};
        max[0][0] = A[0], mmax[0] = A[0];
        for(a = 1; a < n; a++) {
            if(max[0][a-1] > 0)    max[0][a] = max[0][a-1] + A[a];
            else max[0][a] = A[a];
            if(max[0][a] > mmax[a-1]) mmax[a] = max[0][a];
            else mmax[a] = mmax[a-1];
        }
        for(a = 1; a < 2; a++) {
            for(b = 0; b < n; b++) max[0][b] = mmax[b];
            max[1][a] = max[0][a-1] + A[a];
            mmax[a] = max[1][a];
            for(b = a+1; b < n; b++) {
                if(max[0][b-1] > max[1][b-1])
                    max[1][b] = max[0][b-1] + A[b];
                else max[1][b] = max[1][b-1] + A[b];
                if(max[1][b] > mmax[b-1]) mmax[b] = max[1][b];
                else mmax[b] = mmax[b-1];
            }
        }
        printf("%d\n", mmax[n-1]);
    }
    return 0;
}
/*
http://www.cppleyuan.com/viewthread.php?tid=1240
*/

上一篇:d831. 畢業旅行

下一篇:d903. 數學達人