首页 > 其他分享 >【树上背包】洛谷 P4516 [JSOI2018] 潜入行动

【树上背包】洛谷 P4516 [JSOI2018] 潜入行动

时间:2022-10-03 20:58:32浏览次数:77  
标签:装置 洛谷 JSOI2018 sum P4516 int 监听 dp mod

P4516 [JSOI2018] 潜入行动

省选/NOI-树上背包计数

题意略

  • 设状态为 \(dp[u][j][0/1][0/1]\) ,u 点子树放了 j 个装置,u 点有没有放装置,u 点有没有被监听的方案数。
  • 对于转移时两点 u, v,考虑 u 点的情况
  • 如果 u 没有放装置也没有被监听,v 一定不能放装置但 v 要被监听(否则 u 被监听)。
    • \[dp[u][i+j][0][0] = \sum dp[u][i][0][0] \times dp[v][j][0][1] \]

  • 如果 u 没有放装置但被监听,v 的状态为被监听。对于 dp[u][k][0][1] 放不放装置无所谓, 对于 dp[u][k][0][0] v 必须放装置。
    • \[dp[u][i+j][0][1] = \sum dp[u][i][0][1] \times (dp[v][j][0][1] + dp[v][j][1][1]) + \sum dp[u][i][0][0] \times dp[v][j][1][1] \]

  • 如果 u 放了装置但没有被监听,v 有没有被监听无所谓,一定没有放装置。
    • \[dp[u][i+j][1][0] = \sum dp[u][i][1][0]\times (dp[v][j][0][1] + dp[v][j][0][0]) \]

  • 如果 u 放了装置且被监听,对于 dp[u][k][1][0], v 一定放装置,有没有被监听无所谓。对于 dp[u][k][1][1] v 放不放装置,被不被监听都无所谓。
    • \[dp[u][i+j][1][0]=\sum dp[u][i][1][0]\times (dp[v][j][1][0] + dp[v][j][1][1]) \]

    • \[dp[u][i+j][1][1]=\sum dp[u][i][1][1]\times (dp[v][j][0][0]+dp[v][j][0][1]+dp[v][j][1][0]+dp[v][j][1][1]) \]

  • 转移复杂度是 \(O(nk)\) ,数组不能开 long long ,转以后再更新子树大小。
const int N = 1e5 + 10, mod = 1e9 + 7;
int n, K;
vector<int> edge[N];
int dp[N][110][2][2], tmp[110][2][2], sz[N];

void dfs(int u, int p) {
    sz[u] = 1;
    dp[u][0][0][0] = dp[u][1][1][0] = 1;
    for (auto v: edge[u]) {
        if (v == p) continue;
        dfs(v, u);
        memcpy(tmp, dp[u], sizeof tmp);
        memset(dp[u], 0, sizeof tmp);
        for (int i = 0; i <= min(sz[u], K); i++) {
            for (int j = 0; j <= min(sz[v], K) && i + j <= K; j++) {
                dp[u][i + j][0][0] += 1ll * tmp[i][0][0] * dp[v][j][0][1] % mod;
                dp[u][i + j][0][1] += (1ll * tmp[i][0][1] * (dp[v][j][0][1] + dp[v][j][1][1]) + 1ll * tmp[i][0][0] * dp[v][j][1][1]) % mod; 
                dp[u][i + j][1][0] += 1ll * tmp[i][1][0] * (dp[v][j][0][1] + dp[v][j][0][0]) % mod;
                dp[u][i + j][1][1] += (1ll * tmp[i][1][0] * (dp[v][j][1][0] + dp[v][j][1][1]) +
                    1ll * tmp[i][1][1] * (1ll * dp[v][j][0][0] + dp[v][j][0][1] + dp[v][j][1][0] + dp[v][j][1][1])) % mod;
                if (dp[u][i + j][0][0] >= mod) dp[u][i + j][0][0] -= mod;
                if (dp[u][i + j][0][1] >= mod) dp[u][i + j][0][1] -= mod;
                if (dp[u][i + j][1][0] >= mod) dp[u][i + j][1][0] -= mod;
                if (dp[u][i + j][1][1] >= mod) dp[u][i + j][1][1] -= mod;
            }
        }
        sz[u] += sz[v];     // 转移后再更新子树大小
    }
    return ;
}

int main() {
    re(n), re(K);
    for (int i = 1; i < n; i++) {
        int a, b;
        re(a), re(b);
        edge[a].pb(b), edge[b].pb(a);
    }
    dfs(1, -1);
    ll ans = (dp[1][K][0][1] + dp[1][K][1][1]) % mod;
    printf("%lld\n", ans);
    return 0;
}

标签:装置,洛谷,JSOI2018,sum,P4516,int,监听,dp,mod
From: https://www.cnblogs.com/Roshin/p/P4516.html

相关文章

  • 洛谷 P8557 炼金术 题解
    题目大意给定\(n\)种金属,放进\(k\)个熔炉,要求最终每种金属都要能从熔炉里拿出来,求熔炉炼金的方案数对\(998244353\)取模。分析从金属角度考虑。不难发现对于每......
  • 洛谷 P3388 【模板】割点(割顶)
    题目链接:https://www.luogu.com.cn/problem/P3388 【模板】割点(割顶)题目背景割点题目描述给出一个$n$个点,$m$条边的无向图,求图的割点。输入格式第一行输入两个......
  • 洛谷 P4840 解题报告
    洛谷P4840解题报告STEP1.题目大意求字符串\(S\)的所有循环同构中本质不同的回文子串数量的最大值。数据范围$|S|\leq1.5e6$STEP2.思路分析看到回......
  • 洛谷P3375 kmp字符串匹配
    #include<bits/stdc++.h>#defineintlonglongusingnamespacestd;inti,j,k,la,lb,kmp[1000005];chara[1000005],b[1000005];signedmain(){  scanf("%s%s",......
  • 洛谷 P1506 拯救oibh总部(DFS / 染色法)
    https://www.luogu.com.cn/problem/P1506题目描述给定n*m的图形,由*和0组成。让我们求出被*四面包围了的0的数量。输入#1450000000*000*0*000*00输出......
  • 洛谷 P2709 小B的询问 题解
    莫队板子。//P2709小B的询问#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintMAXN=50005;structQuery{ intl,r,id;}q[MAXN];in......
  • 洛谷 P2419 [USACO08JAN]Cow Contest S(最短路:floyed)
    https://www.luogu.com.cn/problem/P2419题目大意:给定n头奶牛(1<=N<=100),按1..N依次编号。m轮:两两之间进行对决,赢了的排在左边,输了的排在右边。我们想知道奶牛们编......
  • 洛谷P8551 Bassline 题解
    P8551Bassline题解分析这道题做月赛的时候想了好久,最后发现其实很简单。我们用样例数据来分析:如图所示,我们将每个区间抽象化为一个一个的长条。题目给我们的两个要......
  • 洛谷 P7861 SAVEZ 题解(哈希)
    2020牛客杯NOIP赛前集训提高第一场T2牛牛的猜球游戏题解目录2020牛客杯NOIP赛前集训提高第一场T2牛牛的猜球游戏题解比赛链接题目题目描述输入格式输出格式样例样例......
  • P2671 [NOIP2015 普及组] 求和(洛谷前缀和
    P2671[NOIP2015普及组]求和1//(x+z)*(num[x]+num[z])=2//(x1+x2)*(y1+y2)+(x1+x3)*(y1+y3)+(x2+x3)*(y2+y3)3//=x1*(y1*(n-2)+y1+y2+...+yn)4//+x2*(y2*......