time limit: 10 sec memory limit: 128 mb
小宇從歷史書上了解到乙個古老的文明。這個文明在各個方面高度發達,交通方面也不例外。考古學家已經知道,這個文明在全盛時期有n座城市,編號為1..n。m條道路連線在這些城市之間,每條道路將兩個城市連線起來,使得兩地的居民可以方便地來往。一對城市之間可能存在多條道路。
據史料記載,這個文明的交通網路滿足兩個奇怪的特徵。首先,這個文明崇拜數字k,所以對於任何一條道路,設它連線的兩個城市分別為u和v,則必定滿足1 <=|u - v| <= k。此外,任何乙個城市都與恰好偶數條道路相連(0也被認為是偶數)。不過,由於時間過於久遠,具體的交通網路我們已經無法得知了。小宇很好奇這n個城市之間究竟有多少種可能的連線方法,於是她向你求助。
方法數可能很大,你只需要輸出方法數模1000000007後的結果。
輸入共一行,為3個整數n,m,k。
輸出1個整數,表示方案數模1000000007後的結果。
【輸入樣例1】
3 4 1
【輸入樣例2】
4 3 3
【輸出樣例1】
3【輸出樣例2】
4100%的資料滿足1<= n <= 30, 0 <= m <= 30, 1 <= k <= 8.
【題目說明】兩種可能的連線方法不同當且僅當存在一對城市,它們間的道路數在兩種方法中不同。在交通網路中,有可能存在兩個城市無法互相到達。
題解:考試的時候我真的沒有想到……看到了資料範圍比較小,但是我想的是深搜而不是狀壓……
我們發現k的資料範圍很小,所以我們考慮狀壓,首先考慮狀態陣列定義。
首先,f陣列肯定有2維表示列舉到的點數和邊數。我們發現,題目中對每個點的奇偶性有限制,而奇偶是兩種相反的概念,
因此我們嘗試再用一位表示可以和這個點連邊的點的出度奇偶性狀態,1表示奇;但是我們發現,如果這個設定為所有它能轉移到的點的奇偶性(一共16位),
不僅時間複雜度變大,轉移時候的討論也會很複雜,而我們考慮一下,其實只弄一邊的狀態就可以了,從現在的點往後轉移相當於從後面的點往前轉移
因此我們只儲存i點以及前面k個點的狀態即可,我們再設定一維l,表示我們已經考慮到了前面k+1個點中的第l個點(我們設高位離著i點最近,第0位是點i-k,第k位是i點,一共k+1位)
於是我們得到了乙個四維的狀態陣列,f[35][35][(1<<9)[10],接下來我們考慮轉移
考慮對第i-k+l個點與第i個點,如果我們不再加邊,就直接轉移到下乙個f[i][j][state][l+1]
如果我們再還合法的情況下加邊,會同時改變i點和i-k+l這兩個的出度奇偶性,也就是轉移到f[i][j+1][state^(1《然後我們考慮不同i之間的轉移。如果當前狀態要轉移的話,我們現在第i-k個點永遠不會再被考慮,因此轉移的前提之一是第i-k位奇偶性是0,即state&1==0
並且,我們還可以發現乙個很有用的性質:對於點i+1,它初始state就是第i個點的state>>1,這一點很顯然,從我們第3維的定義中就能看出這一操作可以實現
這樣的話,就有跨第一維的轉移,即向f[i+1][j][u>>1][0]轉移
再最後的時候,輸出f[n+1][m][0][0]即可,**見下:
1 #include 2 #include 3using
namespace
std;
4 typedef long
long
ll;5
const ll mod=1000000007;6
int n,m,k,bin[20],f[40][40][(1
<<9)+10][10];7
intmain()823
if((u&1)==0&&f[i][j][u][k])
24 f[i+1][j][u>>1][0]=f[i][j][u][k];25}
26 printf("
%d",f[n+1][m][0][0
]);27 }
bzoj3195 Jxoi2012 奇怪的道路
time limit 10 sec memory limit 128 mb submit 544 solved 354 submit status discuss 小宇從歷史書上了解到乙個古老的文明。這個文明在各個方面高度發達,交通方面也不例外。考古學家已經知道,這個文明在全盛時期有n座城市,編號為...
bzoj3195 Jxoi2012 奇怪的道路
題目鏈結 一張 n 個點 m 條邊的無向圖,每個點度數為偶數,乙個點只能向標號與它的差不超過 k 的點連邊,問構圖方案。三維狀態搞了半天的我眼淚掉下來t t f i j s l 表示,前 i 個點,已經連了 m 條邊,第 i k 個點到第 i 個點的狀態為 s 當前討論 i 與 i k l 的連邊情...
bzoj 3195 奇怪的道路 狀壓dp
看範圍,狀壓沒毛病 但是如果隨便連的話給開1 16,乘上n,m就爆了 所以規定轉移時只向回連邊 於是想狀態陣列 f i j 表示到i這裡i前k位的狀態為j 表示奇偶 發現有條數限制,但是n,m,2 k都比較小,加一維,f i j k 表示前i位,用j條路,i前的k位狀態為j 轉移的話,因為1 u v...