SSL P2147 配置魔藥

2021-08-14 17:48:19 字數 1872 閱讀 3786

魔法課時,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...