動態規劃 ybt1301 大盜阿福

2022-05-30 16:48:09 字數 1930 閱讀 7256

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

這條街上一共有 n

'>n

家店鋪,每家店中都有一些現金。阿福事先調查得知,只有當他同時洗劫了兩家相鄰的店鋪時,街上的報警系統才會啟動,然後警察就會蜂擁而至。

作為一向謹慎作案的大盜,阿福不願意冒著被警察追捕的風險行竊。他想知道,在不驚動警察的情況下,他今晚最多可以得到多少現金?

輸入的第一行是乙個整數t(t

≤50)'>t(t≤50)

,表示一共有t組資料。

接下來的每組資料,第一行是乙個整數n(1

≤n≤100

,000

)'>n(1≤n≤100,000)

,表示一共有n

'>n

家店鋪。第二行是n

'>

n個被空格分開的正整數,表示每一家店鋪中的現金數量。每家店鋪中的現金數量均不超過1000

'>1000

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

2

31 8 2

410 7 6 14

8

24

對於第一組樣例,阿福選擇第2

'>

2家店鋪行竊,

2'>獲得的現金數量為8

'>8

。對於第二組樣例,阿福選擇第1

'>

1和4'>4

家店鋪行竊,

1'>4

'>獲得的現金數量為10+14

=24'>10+14=24。1

'>4

'>10+14

=24'>一道典型的動規題目。

1'>4

'>10+14

=24'>先設定狀態。設陣列value [i]  表示第 i 家店鋪的現金數量,

1'>4

'>10+14

=24'>dp [i] [0/1] 表示第 i 家店鋪的狀態,0表示不洗劫這家店鋪所能獲得的最多現金,1表示洗劫這家店鋪所能獲得的最多現金。

兩種情況:1.第 i  家店鋪已經被洗劫了。那麼與它相鄰的第 i - 1 家店鋪不能被洗劫,要不然就會觸發警報。所以第 i 家店鋪被洗劫的狀態 dp [i] [1] 繼承的是它前面一家店鋪沒有被洗劫的狀態,同時還要加上洗劫第 i 家店鋪獲得的現金,也就是 dp [i] [1] = dp [i-1] [0] + value [i] ;

2.第 i 家店鋪沒有被洗劫。那麼第 i - 1 家店鋪有可能被洗劫也有可能沒有,也就是說 dp [i] [0] 繼承的是它的前面的店鋪沒有被洗劫和有被洗劫的狀態,兩者取乙個最大值即可,即 dp [i] [0] = max ( dp [i-1] [0] , dp [i-1] [1] )。

至於初始狀態,那就是 dp [1] [0] = 0 (很明顯第一家店鋪沒有被洗劫,沒有獲得現金)和 dp [1] [1] = value [1](第一家店鋪被洗劫,獲得對應現金) 了。

同時要注意資料範圍,不能太小,value 至少要開到大於 100,000 。

#include#include

#include

using

namespace

std;

int dp[100001][2

];int value[100001

];int n,t;//

店鋪量,資料組數

intmain()

dp[1][0]=0

; dp[

1][1]=value[1

];

for(int i=2; i<=n; i++)

cout

<0],dp[n][1])

0,sizeof(dp));//

下一組資料

}

return0;

}

第九章 動態規劃 1301 大盜阿福

1301 大盜阿福 時間限制 1000 ms 記憶體限制 65536 kb 提交數 3388 通過數 1400 題目描述 阿福是一名經驗豐富的大盜。趁著月黑風高,阿福打算今晚洗劫一條街上的店鋪。這條街上一共有 n 家店鋪,每家店中都有一些現金。阿福事先調查得知,只有當他同時洗劫了兩家相鄰的店鋪時,街...

23 大盜阿福

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

23 大盜阿福

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