AGC067D Unique Matching 题解
虽然我似乎已经做出来过
首先很显然,我们只需求出只能匹配成
我们可以在平面上绘制
所以我们不妨直接针对白色区域的形态进行计数。固定白色区域形态后,横线和竖线的方案数都可以简单算出。而对于白色区域而言,只要枚举白色区域的最靠右的空列就可以简单地转移。这个 dp 有很多种方法,就不细说了(
dp[1][0]=1;dp[0][0]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
add(dp[i][1],mut({dp[i-j][1]+dp[i-j][0],dp[j][0],i-j+1}));
add(dp[i][2],mut({dp[i-j][1]+dp[i-j][0],dp[j][0],1}));
}
for(int j=1;j<i;j++)add(dp[i][0],mut({dp[i-j][0],dp[j-1][2]+dp[j-1][0],i}));
}
printf("%lld",(dp[n][0]+dp[n][2])*fac[n]%mod);
——主要是因为我这十行不到的 dp 调了两个多小时!!现在我知道我其实不会 dp 了……