程式設計訓練 大盜阿福

2021-10-08 01:44:37 字數 1712 閱讀 6751

題目描述

阿福是一名經驗豐富的大盜。趁著月黑風高,阿福打算今晚洗劫一條街上的店鋪。

這條街上一共有 n家店鋪,每家店中都有一些現金。阿福事先調查得知,只有當他同時洗劫了兩家相鄰的店鋪時,街上的報警系統才會啟動,然後警察就會蜂擁而至。作為一向謹慎作案的大盜,阿福不願意冒著被警察追捕的風險行竊。他想知道,在不驚動警察的情況下,他今晚最多可以得到多少現金?

輸入

輸入的第一行是乙個整數t(t≤50),表示一共有t組資料。

接下來的每組資料,第一行是乙個整數n(1≤n≤100,000),表示一共有n家店鋪。第二行是n個被空格分開的正整數,表示每一家店鋪中的現金數量。每家店鋪中的現金數量均不超過1000。

輸出

對於每組資料,輸出一行。該行包含乙個整數,表示阿福在不驚動警察的情況下可以得到的現金數量。

輸入樣式

2

31 8 2

410 7 6 14

輸出樣例

8

24

提示

對於第一組樣例,阿福選擇第2家店鋪行竊,獲得的現金數量為8。

對於第二組樣例,阿福選擇第1和4家店鋪行竊,獲得的現金數量為10+14=24

題目選自資訊學奧賽 1301 大盜阿福

本題可用到動態規劃思想,因為不能偷相鄰的店鋪,因此可以有兩種情況,一種是選擇編號為i的店鋪現金,一種是選擇編號為i-1和i+1的店鋪的現金之和,然後求出這兩種情況的最大值。

在**中,如果輸入輸出用的cin和cout,在測試的時候容易出現超時,因此要用到printf、scanf,這兩個的速度要比cin、cout快。

**中的sum[i-2]+num[i]就類似於思路中提到的編號i-1和i+1的現金和,sum[i-1]就類似於編號為i的現金和,每乙個sum[i]都是num編號在i以及i以前的最優解。

#include

#include

using

namespace std;

int num[

100001

],sum[

100001];

//num儲存每個店鋪的現金,sum儲存偷盜的現金總數

intmain()

sum[1]

=num[1]

;for

(i=2

;i<=n;i++

)printf

("%d\n"

,sum[n]);

}return0;

}

測試平台結果

編譯器測試結果

DP 大盜阿福

2019 03 07 題目及 更新 阿福是一名經驗豐富的大盜。趁著月黑風高,阿福打算今晚洗劫一條街上的店鋪。這條街上一共有 n 家店鋪,每家店中都有一些現金。阿福事先調查得知,只有當他同時洗劫了兩家相鄰的店鋪時,街上的報警系統才會啟動,然後警察就會蜂擁而至。作為一向謹慎作案的大盜,阿福不願意冒著被警...

23 大盜阿福

描述 阿福是一名經驗豐富的大盜。趁著月黑風高,阿福打算今晚洗劫一條街上的店鋪。這條街上一共有 n 家店鋪,每家店中都有一些現金。阿福事先調查得知,只有當他同時洗劫了兩家相鄰的店鋪時,街上的報警系統才會啟動,然後警察就會蜂擁而至。作為一向謹慎作案的大盜,阿福不願意冒著被警察追捕的風險行竊。他想知道,在...

23 大盜阿福

阿福是一名經驗豐富的大盜。趁著月黑風高,阿福打算今晚洗劫一條街上的店鋪。這條街上一共有 n 家店鋪,每家店中都有一些現金。阿福事先調查得知,只有當他同時洗劫了兩家相鄰的店鋪時,街上的報警系統才會啟動,然後警察就會蜂擁而至。作為一向謹慎作案的大盜,阿福不願意冒著被警察追捕的風險行竊。他想知道,在不驚動...