(題目鏈結)
一張$n$個點$m$條邊的無向圖,每個點度數為偶數,乙個點只能向標號與它的差不超過$k$的點連邊,問構圖方案。
三維狀態搞了半天的我眼淚掉下來t_t
$f[i][j][s][l]$表示,前$i$個點,已經連了$m$條邊,第$i-k$個點到第$i$個點的狀態為$s$,當前討論$i$與$i-k+l$的連邊情況。
如果$i$與$i-k+l$不連邊。$$f[i][j][s][l+1]+=f[i][j][s][l]$$
如果$i$與$i-k+l$連邊。$$f[i][j+1][s*bin[l]*bin[k]][l+1]+=f[i][j][s][l]$$
跳到下乙個$i$,當且僅當$i-k$度數為偶數時可行,因為之後就不會再有節點能夠跟$i-k$連邊了。$$f[i+1][j][s>>1][0]+=f[i][j][s][k]$$
邊界什麼的處理好
// bzoj3195#include#include#include#include#include#include#define ll long long
#define inf (1ll<<30)
#define mod 1000000007
#define pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;
int f[32][32][1<<9][9],bin[30];
int n,m,k;
int main()
else if (n==1)
bin[0]=1;for (int i=1;i<=20;i++) bin[i]=bin[i-1]<<1;
f[2][0][0][0]=1;
for (int i=2;i<=n;i++)
for (int j=0;j<=m;j++)
for (int k=0;k0) (f[i][j+1][k^bin[l]^bin[k]][l]+=f[i][j][k][l])%=mod;
}if (!(1&k)) (f[i+1][j][k>>1][0]+=f[i][j][k][k])%=mod;
}printf("%d",f[n+1][m][0][0]);
return 0;
}
BZOJ3195 Jxoi2012 奇怪的道路
time limit 10 sec memory limit 128 mb 小宇從歷史書上了解到乙個古老的文明。這個文明在各個方面高度發達,交通方面也不例外。考古學家已經知道,這個文明在全盛時期有n座城市,編號為1.n。m條道路連線在這些城市之間,每條道路將兩個城市連線起來,使得兩地的居民可以方便地...
bzoj3195 Jxoi2012 奇怪的道路
time limit 10 sec memory limit 128 mb submit 544 solved 354 submit status discuss 小宇從歷史書上了解到乙個古老的文明。這個文明在各個方面高度發達,交通方面也不例外。考古學家已經知道,這個文明在全盛時期有n座城市,編號為...
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...