n個點,n-1條邊的樹,每個節點都有顏色
1<=k<=10, 1<=n<=5e4
顏色數量少,可以上狀壓,表示選中的顏色,比如5(101)表示當前選的顏色1,3。然後按照這些顏色跑樹上的連通塊,當前連通塊大小是cnt,那麼可以形成的路徑數是cnt(單點)+
但是呢比如5(101)包含了4(100),1(001)這些情況,要進行容斥,最後累加即可。
#includeusing namespace std;
#define io cin.tie(0);ios::sync_with_stdio(false);
#define debug(x) cout<
int color[maxn], vis[maxn];
void dfs(int x, int u)
}int popcnt(int s)
return ans;
}void solve()
ll ans = 0;
for(int t = 1; t < (1 << k); t ++)}}
for(int t = 1; t < (1 << k); t ++)
ans = (ans + dp[t] * f[popcnt(t)] % mod) % mod;
}cout << ans << endl;
}int main()
基本的狀壓DP
給出乙個 times 要求棋子不相鄰,求方案數 n 100 m 8 f i s sum 為零表示不相鄰 s 表示當前行中棋子的情況 解析 我們會發現乙個問題,上述式子確實可以保證上下行不相鄰,但是左右呢,對於我這個剛認識狀壓的菜雞來說,很懵逼,答 狀態壓縮的本質 存在乙個維度是在進製級別表達多組狀態...
狀壓DP的總結
狀壓dp的標誌 資料小 通過題目所給出的條件以後得到的特徵集合小 一 cf259div2 d 題目大意 保證b i 中每個數互質,給出a i 然後求1 n的abs a i b i 最小。a i 30 思路 首先得到b i 必然小於60。這個很重要,因為我們列舉的b的集合就是60.首先當b如果都取1,...
對狀壓dp的見解
看了好幾篇部落格,終於對一些簡單的狀壓dp有了點了解。就像hdu1074。有個部落格 感覺淺顯易懂,但是就是看不出來,然後就是打表 打表 最左邊的一列1 7是 s 1 1 3 的每一種狀態,s是每一塊的第一行,然後 i 0 n 1 temp 1 i 列舉 每一位的1 也就是每一塊的第二行 第三行是 ...