链接:https://ac.nowcoder.com/acm/problem/205036
来源:牛客网



题意:
对n * n 的矩阵中只能涂黑 n 个空,且每行每列都只能涂黑一个空。求横竖对称的方案数。
思路
因为n * n 的矩阵中只能涂黑 n 个空,且每行和每列只能涂黑一个空,
dp[x]表示x*x的矩阵中可能的答案总数。
1.如果第一行 j=1.那么第一行第一列都不能填了,所以有dp[x - 1]种可能.
2.如果 j != 1 ,根据主对角线对称的规则(如果(1,j)被涂黑了,(j,1)也要被涂黑,因为是主对角线对称的),位置(1,j) 与(j,1) 都被填了。那么行和列都会减少2。剩下来x - 2 行 x - 2 列。因为 j 除了1之外还有x-1个位置可选,所以有(x-1)*dp[x - 2]种可能。
综上,状态转移方程: dp[x] = dp[x - 1] + (x - 1) * dp[x - 2]
AC代码
#include<iostream>
using namespace std;
typedef long long ll;
const ll maxn=1e5+10,mod=1e9+7;
ll n,dp[maxn];
int main(){
dp[1]=1,dp[2]=2;
for(int i=3;i<=maxn;i++)
dp[i]=(dp[i-1]+(i-1)*dp[i-2])%mod;
while(cin>>n) cout<<dp[n]<<endl;
}
探讨在n*n矩阵中,遵循每行每列仅涂黑一格且整体保持横竖对称条件下,所有可能的涂色方案数量。通过动态规划方法,建立状态转移方程,最终实现高效计算。
2万+

被折叠的 条评论
为什么被折叠?



