日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

[JSOI2018]潜入行动

發(fā)布時間:2023/11/29 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [JSOI2018]潜入行动 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題解

一道思路不難但是寫起來很麻煩的樹形背包

我們發(fā)現(xiàn)每個節(jié)點有很多信息需要保留

所以就暴力的設(shè)\(f[u][j][0/1][0/1]\)表示點u的子樹分配了j個監(jiān)察器,點u有沒有被控制,點u放沒放監(jiān)察器

然后就分四種情況暴力討論就好了

注意背包的時候要卡常數(shù)

代碼

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> const int M = 100005 ; const int N = 103 ; const int mod = 1e9 + 7 ; using namespace std ; inline int read() {char c = getchar() ; int x = 0 , w = 1 ;while(c>'9'||c<'0') { if(c=='-') w = -1 ; c = getchar() ; }while(c>='0' && c<='9') { x=x*10+c-'0' ; c = getchar() ; }return x*w ; }int n , m , num , hea[M] ; int f[M][N][2][2] , g[N][2][2] , size[M] ; struct E { int nxt , to ; } edge[M * 2] ; inline void add_edge(int from , int to) {edge[++num].nxt = hea[from] ; edge[num].to = to ; hea[from] = num ; } void dfs(int u , int father) {size[u] = 1 ; f[u][0][0][0] = f[u][1][0][1] = 1 ;for(int i = hea[u] ; i ; i = edge[i].nxt) {int v = edge[i].to ; if(v == father) continue ; dfs(v , u) ;for(int j = 0 ; j <= min(m , size[u]) ; j ++) {g[j][0][0] = f[u][j][0][0] ; f[u][j][0][0] = 0 ;g[j][0][1] = f[u][j][0][1] ; f[u][j][0][1] = 0 ;g[j][1][0] = f[u][j][1][0] ; f[u][j][1][0] = 0 ;g[j][1][1] = f[u][j][1][1] ; f[u][j][1][1] = 0 ;}for(int j = 0 ; j <= min(size[u] , m) ; j ++) {for(int k = 0 ; k <= size[v] && j + k <= m ; k ++) {f[u][j + k][0][0] = (f[u][j + k][0][0] + 1LL * g[j][0][0] * f[v][k][1][0]) % mod ;f[u][j + k][0][1] = (f[u][j + k][0][1] + 1LL * g[j][0][1] * (f[v][k][1][0] + f[v][k][0][0]) % mod) % mod ;f[u][j + k][1][0] = ((f[u][j + k][1][0] + 1LL * g[j][1][0] * (f[v][k][1][0] + f[v][k][1][1]) % mod) % mod + 1LL * g[j][0][0] * f[v][k][1][1] % mod) % mod ;f[u][j + k][1][1] = ((f[u][j + k][1][1] + 1LL * g[j][1][1] * (((f[v][k][1][0] + f[v][k][1][1]) % mod + f[v][k][0][0] ) % mod + f[v][k][0][1]) % mod ) % mod + 1LL * g[j][0][1] * (f[v][k][0][1] + f[v][k][1][1]) % mod) % mod ;}}size[u] += size[v] ;} } int main() {n = read() ; m = read() ; for(int i = 1 , u , v ; i < n ; i ++) {u = read() ; v = read() ;add_edge(u , v) ; add_edge(v , u) ;}dfs(1 , 1) ;printf("%d\n",(f[1][m][1][0] + f[1][m][1][1]) % mod) ;return 0 ; }

轉(zhuǎn)載于:https://www.cnblogs.com/beretty/p/10306252.html

總結(jié)

以上是生活随笔為你收集整理的[JSOI2018]潜入行动的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。