有一說一,這題在洛谷上能評到黑題??
但是其實還可以了,鍛鍊細節能力和分析能力吧
題目大意:
有n個點,有k個監視器,每個點至多放乙個,被放在點上的監視器可以監控到與他相連的所有點但不包括他自己,求覆蓋到整棵樹並且用完k個監視器的方案數
狀態應該挺好想的:
設\(dp[i][j][0/1][0/1]\)表示在根為\(i\)的子樹中放了\(j\)個監視器,\(i\)是否放了,\(i\)是否被監視到,0表示沒有。
然後是比較麻煩和細節的轉移
注意:先把\(dp[i]\)拷貝出來並清空,然後再dp
講下轉移的過程
對於樹u,列舉兒子v,在v之前放了多少個監視器j,在v中放了多少個監視器t
則由\(dp[u][j]×dp[v][t]\)就可以轉移到\(dp[u][j+t]\)
具體一些:
(f為拷貝出來的dp[u])
第一種情況:u上不放,u不被監視到
\[dp[u][j+t][0][0]+=f[j][0][0]×dp[v][j][0][1]
\]分析:v之前u必須也不放,不被監視到,v上不能放,但是要保證u的子樹都要被監視到,所以v的第四維為1,根據乘法原理計數即可
第二種情況:u上放,u不被監視到
分析:在v之前u上放了,由於u上放了,所以會讓v一定被監視到,所以\(dp[v][t][0]\)的第四維取0/1均可(因為在這之後v始終會被u監視)
\[dp[u][j+t][1][0]+=f[u][j][1][0]×(dp[v][t][0][0]+dp[v][t][0][1])
\]第三種情況:u上不放,u被監視到了
分析:由於u不放所以v必須已經被監視到
然後兩種子情況:
1、在v之前u已經被監視,此時v上放不放監視器都不影響,所以都取
\[dp[u][j+t][0][1]+=f[j][0][1]×(dp[v][t][0][1]+dp[v][t][1][1])
\]2、在v之前u未被監視到,由於v上放了監視器所以u被監視到了
\[dp[u][j+t][0][1]+=f[j][0][0]×dp[v][t][1][1]
\]都加起來就行
第四種情況:u上放了,u被監視到
分析:因為u上放了,所以v被不被監視到都可以取,因為v在這之後會被u監視到
依然是兩種子情況:
1、在v之前u已經被監視到了:此時v上放不放監視器都行
(那就是v上放不放監視器,v被不被監視到都行,共4種
\[dp[u][j+t][1][1]+=f[j][1][1]×(dp[v][t][0][0]+dp[v][t][0][1]+dp[v][t][1][0]+dp[v][t][1][1])
\]2、在v之前u尚未被監視到:此時v上必須放監視器
\[dp[u][j+t][1][1]+=f[j][1][0]×(dp[v][t][1][0]+dp[v][t][1][1])
\]作為個強迫症,我把第乙個dp中\(f[j][1][1]×(dp[v][t][1][0]+dp[v][t][1][1])\)的部分也放在下面來了(解釋下**和分析的不一樣之處
最後輸出答案的時候,要把\(dp[1][k][0][1]\)和\(dp[1][k][1][1]\)加起來,因為1節點放不放都行,只要監視到即可。
#include#define rep(i,x,y) for (int i=x;i<=y;i++)
#define res(i,x,y) for (int i=x;i>=y;i--)
using namespace std;
typedef long long ll;
const int maxn=100010,mod=1000000007;
int n,k;
struct edgeedge[maxn<<1];
int cnt=0,head[maxn];
int dp[maxn][105][2][2];
int siz[maxn];
inline void addedge(int u,int v);head[u]=cnt;
}void add(int &x,int y)
int f[105][2][2];
void dfs(int u,int fa)
siz[u]+=siz[v];
}}int read()
int main()
dfs(1,0);
add(dp[1][k][0][1],dp[1][k][1][1]);
printf("%lld\n",dp[1][k][0][1]);
return 0;
}
bzoj 5314 Jsoi2018 潛入行動
description 外星人又雙叒叕要攻打地球了,外星母艦已經向地球航行!這一次,jyy已經聯絡好了 艦隊,打算聯合所有jso ier抵禦外星人的進攻。在 艦隊就位之前,jyy打算事先了解外星人的進攻計畫。現在,攜帶了監聽裝置的 已經秘密潛入了外星人的母艦,準備對外星人的通訊實施監聽。外星人的母艦...
小店購物 JSOI2008 BZOJ 2260
grant是乙個個體戶老闆,他經營的小店因為其豐富的優惠方案深受附近居民的青睞,生意紅火。小店的優惠方案十分簡單有趣。grant規定 在一次消費過程中,如果您在本店購買了精製油的話,您購買香皂時就可以享受2.00元 塊的 如果您在本店購買了香皂的話,您購買可樂時就可以享受1.50元 聽的 諸如此類的...
BZOJ 4327 JSOI2012 玄武密碼
字尾自動機裸題。藉著這道裸題總結一下字尾自動機的查詢問題。1.查字首 查詢時不跳parent,遇到空節點就跳出。2.查子串 查詢時跳parent,記錄最大ans.3.查次數 lct維護right陣列 4.查不同的串的數目 在建樹時維護,乙個點對答案的貢獻為this max len this pare...