魔法課時,harry面前有兩個坩堝,有許多種藥材。乙個坩堝相同時間內只能加工一種藥材,但是不一定每一種藥材都要加進坩堝裡。魔法課的時間只有t,有n種藥材,會給出加工第i種藥材的起始時間t1、結束時間t2,和藥效w。現在要求的就是harry可以得到最大的藥效。
對於30%的資料
1<=t<=500
1<=n<=15
1<=w<=100
1<=t1<=t2<=t
對於100%的資料
1<=t<=500
1<=n<=100
1<=w<=100
1<=t1<=t2<=t
動態規劃:
這題其實很明顯就是用dp做了,而且貌似有很多種方式。
我是設
f[i,j,k]表示前i個第乙個坩堝選到了第j個第二個坩堝選到了第k個時的最大藥效。
將時間排序,開始時間公升序,相同時保證結束時間公升序即可不用考慮dp存在的後效性。
每次向後更新:
對於乙個a[i].l>a[j].r的時候
很明顯第乙個可以將i給選了
即f[i,i,k]=max(f[i,i,k],f[i,j,k]+wi)
而對於乙個a[i].l>a[k].r的時候同理
f[i,j,i]=max(f[i,j,i],f[i,j,k]+wi)
在其中找乙個最大值即可。
因為保證所有的開始結束時間都在t內,所以不用去考慮結束時間》t的情況。
時間複雜度:o(n^3)
var
f:array [0..101,0..101,0..101] of longint;
a:array [0..101,1..3] of longint;
ans,t,n,i,j,k:longint;
function
max(aa,bb:longint):longint;
begin
if aa>bb then
exit(aa);
exit(bb);
end;
begin
readln(t,n);
for i:=1
to n do
readln(a[i,1],a[i,2],a[i,3]);
for i:=1
to n-1
dofor j:=i+1
to n do
if (a[i,1]>a[j,1]) or ((a[i,1]=a[j,1]) and (a[i,2]>a[j,2]))
then
begin
a[0]:=a[i];
a[i]:=a[j];
a[j]:=a[0];
end;
ans:=0;
a[0,1]:=0; a[0,2]:=0; a[0,3]:=0;
for i:=1
to n do
for j:=0
to i-1
dofor k:=0
to i-1
dobegin
f[i,j,k]:=f[i-1,j,k];
if a[i,1]>a[j,2] then
begin
f[i,i,k]:=max(f[i,i,k],f[i-1,j,k]+a[i,3]);
ans:=max(ans,f[i,i,k]);
end;
if a[i,1]>a[k,2] then
begin
f[i,j,i]:=max(f[i,j,i],f[i-1,j,k]+a[i,3]);
ans:=max(ans,f[i,j,i]);
end;
end;
writeln(ans);
end.
2 14 遞迴匹配
遞迴匹配在匹配具有巢狀結構的字串時特別有效。給定算術表示式 1 2 3 4 該表示式具有巢狀結構。如果需要使用正規表示式檢查該表示式的結構是否正確,則使用遞迴匹配能夠解決該問題。注意 本小節中下面介紹的遞迴匹配為.net framework所支援。在.net framework中,正規表示式用於遞迴...
演算法導論2 1 4
有兩個各存放在陣列a和b中的n位二進位制整數,考慮他們的相加問題。翻譯的夠爛 兩個整數的和存放在有n 1個元素的陣列c中,請給出這個問題的形式化描述,並給出偽 考慮兩個1位二進位制數a和b,假設它們的和c是個2位二進位制數,c 1 a 在考慮兩個2位二進位制數 當第一位相加時,先計算進製位c2 a1...
SSL P1786 麻將遊戲
尋求最短路徑,但可越出平板 暫時性 相對其他的題目來說比較難,但只要處理好一些細節後,便會從複雜到簡單。我絕對不會說出ta是最小轉彎的 公升級版!include include include include define ll long long using namespace std inlin...