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次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力...