TYVJ P1180 情況少分支多的過程 Dp)

2021-12-29 22:43:05 字數 2280 閱讀 4799

p1180 - 礦工配餐

from admin    normal (oi)

總時限:16s    記憶體限制:128mb    **長度限制:64kb

描述 description

現有兩個煤礦,每個煤礦都雇用一組礦工。採煤工作很辛苦,所以礦工們需要良好飲食。每當一輛食品車到達煤礦時,礦工們便會產出一定數量的煤。有三種型別的食品車:肉車,魚車和麵包車。

礦工們喜歡變化的食譜。如果提供的食品能夠不斷變化,他們的產煤量將會增加。每當乙個新的食品車到達煤礦時,礦工們就會比較這種新的食品和前兩次(或者少於兩次,如果前面運送食品的次數不足兩次)的食品,並且:

如果這幾次食品車都是同一型別的食品,則礦工們產出乙個單位的煤。

如果這幾次食品車中有兩種不同型別的食品,則礦工們產出兩個單位的煤。

如果這幾次食品車中有三種不同型別的食品,則礦工們產出三個單位的煤。

預先已知食品車的型別及其被配送的順序。通過確定哪車食品送到哪個煤礦可以影響產煤量。食品車不能被拆分,每個食品車必須被全部送到乙個或另乙個煤礦。兩個煤礦也並不要求接收相同數量的食品車(事實上,也允許將所有食品車都送到乙個煤礦)。

任務給出食品車的型別及其被配送的順序,要求你寫乙個程式,確定哪個食品車應被送到煤礦1,哪個食品車應被送到煤礦2,以使得兩個煤礦的產煤量的總和最大。

輸入格式 inputformat   www.2cto.com

輸入的第一行包含乙個整數n (1 ≤ n ≤ 100 000),  表示食品車的數目。

第二行包含乙個由n個字元組成的字串,按照配送順序依次表示食品車配送的食品的型別。每個字元是以下三個大寫字母之一:'m' (表示肉類), 'f' (表示魚類) 或 'b' (表示麵包)。

輸出格式 outputformat

輸出乙個整數,表示最大的總產煤量。

樣例輸入 sampleinput [複製資料]

樣例輸入1

6mbmffb

樣例輸入2

16mmbmbbbbmmmmmbmb

樣例輸出 sampleoutput [複製資料]

樣例輸出1

12樣例輸入2

29資料範圍和注釋 hint

在樣例1中,可以按照如下的順序運送食品車:煤礦 1, 煤礦 1, 煤礦 2, 煤礦 2, 煤礦 1, 煤礦 2, 依次產生的產煤量為1, 2, 1, 2, 3 和 3 個單位,一共是12 個單位。還有其它運送方式也能產生上述最大總和的產煤量。

時間限制 timelimitation

前10點時限1s,分值8分

後2點時限3s,分值10分

這題看著就是不可解的。

但是仔細觀察會發現它的情況較少,分支巨多(2^n)??

於是我們用滾動陣列+dp顯然可以用f[i][j][k][l][m]表示子結構

j,k,l,m為2個礦工最近2次的伙食(0表示沒有)

任何坑爹的題目先想想能不能dp……

記憶化搜尋不能滾動還會爆棧,於是dp的存在性證畢。

[cpp] 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

using namespace std; 

#define maxn (100000+10) 

#define ndebug 

int n,a[maxn]; 

int f[2][4][4][4][4]; //1->m 2->f 3->b 

int cost[4][4][4]=; 

int _cost(int i,int j,int k) 

int main() 

}    

for (int i=0;i<=3;i++) 

for (int j=0;j<=3;j++) 

for (int k=0;k<=3;k++) 

memset(f,128,sizeof(f)); 

f[0][0][0][0][0]=0; 

for (int ii=0;ii

}            

} int ii=n%2,ans=0; 

for (int j=0;j<=3;j++) 

for (int k=0;k<=3;k++) 

for (int l=0;l<=3;l++) 

for (int m=0;m<=3;m++) 

ans=max(ans,f[ii][j][k][l][m]); 

cout<

return 0; }  

創業計畫1 180

7 30 8 30晨練,做飯,發貨,手環充電 8 30 11 30投簡歷,學習高中數學知識,文案 功課 11 30 2 00午飯,午休,閒魚談工作 2 00 5 00發傳單500張,買茶 5 00 7 00練習彈跳,做飯 7 00 11 00創業任務,準備面試 閒魚每個賬號都要上架一件行李箱 大約1...

tyvj p1008 傳球遊戲

p1008傳球遊戲 noip2008複賽普及組第三題 上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師...

Tyvj P1066 合併果子

描述 在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n 1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力...