专栏文章
题解:CF888F Connecting Vertices
CF888F题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @miqdovni
- 此快照首次捕获于
- 2025/12/04 03:06 3 个月前
- 此快照最后确认于
- 2025/12/04 03:06 3 个月前
Solution
显然要断环成链。我们要计算出 表示 和 联通的方案数。
如果 和 之间需要有连边,则将它删掉之后,区间 中的点恰好分为两个连通块;如果没有连边,我们可以找到最大的 使得 和 有连边,这样拆分成 联通与 联通。
我们发现,还是要记录 和 有连边的方案数,设为 。
因此转移就是:
以及
答案就是 。
CPP#include<bits/stdc++.h>
#define int long long
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=500+10,MOD=1e9+7;
int n,a[MAXN][MAXN],f[MAXN][MAXN],g[MAXN][MAXN];
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n;
ffor(i,1,n) ffor(j,1,n) cin>>a[i][j];
ffor(i,1,n) f[i][i]=1;
ffor(len,2,n) for(int l=1,r=len;r<=n;l++,r++) {
if(a[l][r]) ffor(t,l,r-1) g[l][r]=(g[l][r]+f[l][t]*f[t+1][r])%MOD;
f[l][r]=g[l][r];
ffor(u,l+1,r-1) f[l][r]=(f[l][r]+f[l][u]*g[u][r])%MOD;
}
cout<<f[1][n];
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...