[题解]AT_abc217_f [ABC217F] Make Pair

思路

区间 DP 好题,合并的时候十分毒瘤。

首先,定义 dpi,j 表示合并 [i,j] 区间不同的方案的数量。不难发现,如果区间长度为奇数(即 ji+1 为奇数),一定无法合并。

然后,如果 i,j 是朋友关系,有 dpi,j=dpi+1,j1

接着,我们可以枚举一个中间点 k,如果 k,j 是朋友关系,那么,区间被分为了 [i,k),[k,j] 两个区间,易得(还要乘一个组合数是因为还要考虑交换顺序所带来的不同方案数):

dpi,jdpi,j+dpi,k1×dpk,j×Cji+12rk+12

Code

#include <bits/stdc++.h>  
#define int long long  
#define re register  
  
using namespace std;  
  
const int N = 510,mod = 998244353;  
int n,m;  
int C[N][N],dp[N][N];  
bool vis[N][N];  
  
inline int read(){  
    int r = 0,w = 1;  
    char c = getchar();  
    while (c < '0' || c > '9'){  
        if (c == '-') w = -1;  
        c = getchar();  
    }  
    while (c >= '0' && c <= '9'){  
        r = (r << 1) + (r << 3) + (c ^ 48);  
        c = getchar();  
    }  
    return r * w;  
}  
  
signed main(){  
    n = read() << 1;  
    m = read();  
    for (re int i = 1;i <= m;i++){  
        int a,b;  
        a = read();  
        b = read();  
        if (!((b - a + 1) & 1)){//长度为偶数才有可能合并   
            vis[a][b] = vis[b][a] = true;  
            if (a == b + 1 || a + 1 == b) dp[a][b] = dp[b][a] = 1;  
        }  
    }  
    for (re int i = 0;i <= n;i++){//预处理组合数   
        for (re int j = 0;j <= i;j++){  
            if (!i) C[i][j] = 1;  
            else C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;  
        }  
    }  
    for (re int l = 2;l <= n;l += 2){//只枚举偶数   
        for (re int i = 1;i + l - 1<= n;i++){  
            int j = i + l - 1;  
            if (vis[i][j]) dp[i][j] = dp[i + 1][j - 1];//i,j 是朋友关系   
            for (re int k = i + 2;k < j;k += 2){//只枚举长度为偶数的情况   
                if (vis[k][j]) dp[i][j] = (dp[i][j] + dp[i][k - 1] * dp[k + 1][j - 1] % mod * C[l / 2][(j - k + 1) / 2] % mod) % mod;  
            }  
        }  
    }  
    printf("%lld",dp[1][n]);  
    return 0;  
}  

作者:WaterSun

出处:https://www.cnblogs.com/WaterSun/p/18261948

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   WBIKPS  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示