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 #include2using
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...