题解:CF888F Connecting Vertices
Solution
显然要断环成链。我们要计算出
如果
我们发现,还是要记录
因此转移就是:
以及
答案就是
#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;
}