礦工
【問題描述】
有兩個煤礦,每個煤礦都雇用了一些礦工。挖煤這活很累,所以礦工們需要很多的食物。
正好,每當新的食物到他們的礦上的時候,礦工們將會考慮這乙份和先前的兩份食物(如果沒有那麼多就少考慮些),如下判斷:
·如果所有的食物都是一樣的,他們產1單位的煤。
·如果有兩種食物,生產2單位的煤
·如果有三種不同的食物,生產3單位的煤。
我們提前知道了食物的種類和序列,通過決定哪份食物應該去哪個礦,可以影響產煤量。
食物必須以整份傳送,每份食物必須完全傳送且只傳送給乙個煤礦。兩個煤礦不一定需要同樣份數的食物,實際上,允許將所有食物給同乙個煤礦。
你的程式將被按順序輸入食物的種類,請通過決定哪些食物應當被送到煤礦1、哪些送到煤礦2,找出最大的產量和。
【輸入格式】
第一行是乙個整數n,代表食物的總份數。
第二行是乙個n個字元長的字串,按照食物的順序告訴你他們的種類,每個字母都將會
是『mfb』中的乙個,代表meat ,fish ,bread。
【輸出格式】
僅包含乙個整數,表示最大總產煤量。
【輸入樣例】
6 mbmffb
【輸出樣例】
12 【樣例說明】
對於樣例,按照如下的順序:1,1,2,2,1,2,每次的產煤量是1,2,1,2,3,總計12。也有其餘的等效的順序。
【評分方法】
本題沒有部分分,你的程式的輸出只有和我們的答案完全一致才能獲得滿分,否則不得分。
【資料規模和約定】
對於40%的資料保證n<=20
對於100%的資料保證n<=100000
雙程序dp
var
n:longint;
food:array[1..100000]of longint;
f:array[0..100000,0..3,0..3,0..3,0..3]of longint;
procedure init;
begin
assign(input,'miners.in');
assign(output,'miners.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output);
halt;
end;
procedure readdata;
var i:longint;
ch:char;
begin
readln(n);
for i:=1 to n do
begin
read(ch);
if ch='m' then food[i]:=1;
if ch='b' then food[i]:=2;
if ch='f' then food[i]:=3;
end;
end;
function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;
function js(a,b,c:longint):longint;
begin
if (a<>0)and(b<>0)and(c<>0) then
begin
js:=0;
if (a<>b)and(a<>c)and(c<>b) then exit(3);
if (a<>b)and(a<>c)and(c=b) then exit(2);
if (a<>b)and(a=c)and(c<>b) then exit(2);
if (a=b)and(a<>c)and(c<>b) then exit(2);
if (a=b)and(a=c)and(c=b) then exit(1);
end;
if (a=0)and(b<>0) then
begin
if (b=c) then exit(1);
if (b<>c) then exit(2);
endelse if (a=0)and(b=0) then exit(1);
end;
procedure main;
var i:longint;
i1,i2,j1,j2:longint;
ans:longint;
begin
fillchar(f,sizeof(f),$ff);
f[0,0,0,0,0]:=0;
for i:=1 to n do
for i1:=0 to 3 do
for i2:=0 to 3 do
for j1:=0 to 3 do
for j2:=0 to 3 do
begin
if f[i-1,i1,i2,j1,j2]<>-1 then
begin
f[i,i2,food[i],j1,j2]:=max(f[i,i2,food[i],j1,j2],f[i-1,i1,i2,j1,j2]+js(i1,i2,food[i]));
f[i,i1,i2,j2,food[i]]:=max(f[i,i1,i2,j2,food[i]],f[i-1,i1,i2,j1,j2]+js(j1,j2,food[i]));
end;
end;
ans:=0;
for i1:=0 to 3 do
for i2:=0 to 3 do
for j1:=0 to 3 do
for j2:=0 to 3 do
begin
if f[n,i1,i2,j1,j2]>ans then ans:=f[n,i1,i2,j1,j2];
end;
writeln(ans);
end;
begin
init;
readdata;
main;
terminate;
end.
多程序DP 總結
eg 1 方格取數 noip 2000 如果用兩次一般的動歸,可能不能得到最優解。這如同乙個大蘋果加乙個小蘋果還不如兩個中蘋果加在一起。這時就要考慮更改狀態。因為單獨看第乙個人的位置或第二個人的位置並不能組成乙個完整的狀態,但兩個人的位置合起來就是乙個完整的狀態了,所以新的狀態包含了兩個人的位置。新...
多程序 多程序queue
多程序 import multiprocessing import threading import time defthread run print threading.get ident defrun name time.sleep 2 print hello name t threading....
python多程序 python多程序
當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...