DP專題 2679 跨時代

2022-10-11 17:18:15 字數 1825 閱讀 2259

1.題目描述

鐘逆時針而繞,噁物猙獰的傾巢,我謙卑安靜地於城堡下的晚禱,壓抑遠古流竄的蠻荒暗號,而管風琴鍵高傲的說,那只是在徒勞。我的樂器在環繞,時代無法淘汰我霸氣的皇朝。 你無法預言,因為我越險,翅越豔;沒有句點,跨時代蔓延,翼朝天。 月下浮雕,魔鬼的淺笑,狼迎風嚎,蝠翔似黑潮,用孤獨去調尊嚴的色調。我跨越過世代,如獸般的姿態,琴聲喚起沉睡的血脈。不需要被崇拜,如獸般的悲哀,只為永恆的樂曲存在,醒過來。 去年萬眾矚目的《跨時代》**發行之後,周杰倫又開始了他的世界巡迴演唱會《超時代》。有人說過:如果你喜歡乙個人,那你一定要去看一場他的演唱會;電視機前的1m距離和在演唱會現場哪怕100m的距離,兩種感覺都是截然不同的。

所以小g作為鐵桿歌迷,也計畫帶著小y去看周杰倫的演唱會。 演唱會當然要圈出乙個空地,然後才能布置道具。 演唱會的第一站,公司臨時跟當地的消防局借了n個欄杆,打算用這n個欄杆圍出乙個矩形。而麻煩的是,這些欄杆有長有短,這就給圍場地帶來了一些難度。 所以公司聘請你來寫乙個程式,計算用這n個欄杆做多圍出面積多大的矩形。

(注:必須要剛好圍成乙個矩形,即不能出現多餘的邊長,且不能切斷欄杆,但所給欄杆不一定要全部用上)

2.輸入資料:

第一行乙個正整數n,表示欄杆的數量。

第二行n個正整數,表示每根欄杆的長度li。

4

1 1 1 1

3.輸出資料:

僅一行乙個正整數,表示用給出的欄杆圍成最大矩形的面積,如果不能圍成矩形,輸出」no solution」(不包含引號)。

1

思路分析:

對於這一道題,看到n<=16,應當立馬想到狀壓,首先只考慮柵欄的長,我們將兩條長一起考慮,考慮是否能從乙個集合中選取柵欄組成兩段一樣長的組合,用f[i]來表示總長為i時柵欄的組合,用dp來更新這個f,最後判斷f[sum>>1]是否也成立即可,因為如果f[sum>>1]也成立的話,就能證明存在另外一種方式也能組合成同樣長度,進而證明可以拆成兩半。接下來就可以用深搜來分別在長和寬中加入新邊,直到加入n條後判斷兩組長,寬是否都能拆成兩半,如果可以,則更新面積。

上**:

1 #include2

using

namespace

std;

3const

int maxn=70000;4

intn,ans;

5int l[20];6

int f[2000

],g[maxn];

7void judge(int sum,int

bin)

16} 17}

18if(f[sum>>1]) g[bin]=1

;//如果這個長度折半也能成立,說明它可以拆成兩個合法邊19}

20void

start()

26judge(sum,i);27}

28}29void dfs(int o,int x1,int sum1,int x2,int

sum2)

34return;35

}36 dfs(o+1

,x1,sum1,x2,sum2);

37 dfs(o+1,x1+(1

38 dfs(o+1,x1,sum1,x2+(1

39}//用深搜確定最終答案

40int

main()

總結:

狀壓dp,深搜。

《GMOJ Senior 2679 跨時代》題解

給出n nn根欄杆的長度,讓你從這n nn根欄杆中選出一些欄杆圍成乙個矩形 必須要剛好圍成乙個矩形,即不能出現多餘的邊長,且不能切斷欄杆,但所給欄杆不一定要全部用上 求圍成矩形的最大面積。對於30 30 30 的資料,1 n 10 1 leq n leq 10 1 n 10 對於100 100 10...

JZOJ 2679 跨時代 dfs 狀壓

傳送門 有n nn個棍子,要求我們用這些棍子可以拼出的矩形的最大面積 棍子可以不全用 因為n nn很小,又涉及到方案,我們便開始嘗試用狀壓來表示方案 用d fs dfsdf s來列舉棍子是否使用,憑藉前面狀壓表示出來的方案判斷是否可行,不斷取最大值 include include include i...

jzoj2679 跨時代 揹包,dfs,狀壓

若干根棍子,不能折,不能多餘求能夠組成的最大長方形。首先我們發現如果棍子集合s ss長度為l ll且它有子集g gg長度為l 2 frac 2l 那麼就表示這個集合的棍子可以作為乙個矩形的對應兩邊,這樣我們只要列舉兩個不相交集合作為長寬就好了。我們設g ig i gi 表示二進位制表示的集合i ii...