NOIP2016提高A組模擬9 2 積木

2021-07-22 08:59:12 字數 2972 閱讀 9301

給你一些方塊,給出每個方塊的長寬高,可以以任意一面為底面,用任意的順序選擇任意一些方塊,下面的方塊一定要完全包含上面的方塊(下面方塊的長,寬分別小於上面方塊的長寬)。求最高的搭出積木的高度

看到這個資料範圍,就想到狀壓dp,狀態也是很好設的,我們設f[s,i,j,k]表示當前方塊的選取狀態為s,當前在最上面的方塊是i,它的長和寬分別是j和k(由於乙個方塊只有3個長度,所以j,k的範圍都是1-3的)。轉移的話也很簡單,我們先確定要新增的乙個方塊,然後再確定當前在最上面的方塊,最後再確定兩個方塊以哪一位為底面就可以了。那麼時間複雜度o(

2n−1

∗n2∗

9)在上面

var

f:array[0..65540,1..15,1..3,1..3]of longint;

a:array[0..15,1..3]of longint;

g:array[0..20]of longint;

i,j,k,l,n,x,y,ans:longint;

function

max(x,y:longint):longint;

begin

if x>y then

exit(x) else

exit(y);

end;

procedure

init;

begin

g[1]:=1;

for i:=2

to20

do g[i]:=g[i-1]*2;

readln(n);

for i:=1

to n do

begin

readln(a[i,1],a[i,2],a[i,3]);

f[g[i],i,1,2]:=a[i,3];

f[g[i],i,1,3]:=a[i,2];

f[g[i],i,2,3]:=a[i,1];

f[g[i],i,2,1]:=a[i,3];

f[g[i],i,3,1]:=a[i,2];

f[g[i],i,3,2]:=a[i,1];

end;

end;

begin

init;

for i:=1

to g[n+1]-2

dobegin

for j:=1

to n do

if g[j] and i=0

then

begin

for k:=1

to n do

if g[k] and i<>0

then

begin

for x:=1to3

dobegin

for y:=1to3

doif x<>y then

begin

if (a[j,1]<=a[k,x]) and (a[j,2]<=a[k,y]) and (f[i,k,x,y]>0) then

f[i+g[j],j,1,2]:=max(f[i+g[j],j,1,2],f[i,k,x,y]+a[j,3]);

if (a[j,2]<=a[k,x]) and (a[j,1]<=a[k,y]) and (f[i,k,x,y]>0) then

f[i+g[j],j,2,1]:=max(f[i+g[j],j,2,1],f[i,k,x,y]+a[j,3]);

if (a[j,1]<=a[k,x]) and (a[j,3]<=a[k,y]) and (f[i,k,x,y]>0) then

f[i+g[j],j,1,3]:=max(f[i+g[j],j,1,3],f[i,k,x,y]+a[j,2]);

if (a[j,3]<=a[k,x]) and (a[j,1]<=a[k,y]) and (f[i,k,x,y]>0) then

f[i+g[j],j,3,1]:=max(f[i+g[j],j,3,1],f[i,k,x,y]+a[j,2]);

if (a[j,2]<=a[k,x]) and (a[j,3]<=a[k,y]) and (f[i,k,x,y]>0) then

f[i+g[j],j,2,3]:=max(f[i+g[j],j,2,3],f[i,k,x,y]+a[j,1]);

if (a[j,3]<=a[k,x]) and (a[j,2]<=a[k,y]) and (f[i,k,x,y]>0) then

f[i+g[j],j,3,2]:=max(f[i+g[j],j,3,2],f[i,k,x,y]+a[j,1]);

end;

end;

end;

end;

end;

for i:=1

to g[n+1]-1

dobegin

for j:=1

to n do

for x:=1to3

dofor y:=1to3

doif x<>y then

begin

if f[i,j,x,y]>ans then ans:=f[i,j,x,y];

end;

end;

writeln(ans);

end.

NOIP2016提高組模擬 積木

比賽的時候用了個神奇的小暴力,本來打算拿40分,沒想到暴力出奇蹟,隨機資料下表現優良,居然碾過去了。暴力方法不講,只貼 僅供對拍。正解顯然要用狀態壓縮 看資料範圍 設fs i,0 1 2 s表示當前已選擇的積木集合,i表示在最上方的積木編號,0 1 2表示最上方的積木哪面朝上。轉移方程容易推導。暴力...

計數 NOIP2016提高A組模擬7 15

樣例輸入 2 10 樣例輸出 90資料範圍 剖解題目 題目說的很明了了。思路 求方案數,一般會設計道dp,規律之類的。解法 數字dp,設f i j 表示當前到了第i位,這一位的數字是j的方案數。自然有 f i j f i 1 l f i j 0 l k 且 l 0 and j 0 看到這位數,很明顯...

NOIP2016提高A組模擬9 2 單峰

問1 n,n個數的全排列中有多少個滿足單峰序列的性質,並把答案mod 1e9 7 這題還是很簡單的,一開始打了乙個50分的做法,然後發現答案就是2n 1,然後沒有發現輸入也會爆,於是就得了50分 我們容易發現峰一定是最大的那個數,我們把峰放到每乙個位置上,然後在往峰的左邊隨便填一些數,每種填數的方法...