一、题目描述:
给你一个网格棋盘,
例如,当
想要在这个棋盘上放 k 棋子,也就是这 k 个棋子没有两个在同一行,也没有两个在同一列,问有多少种方案。
答案对
二、解题思路:
棋子是一行一行、一列一列的攻击的,所以我们可以一列一列的
设
容易得到状态转移方程:
其实很好理解:
第 i 列不放棋子的情况下,
第 i 列要放棋子的情况下,
关于 第 i 列剩余位置数量:
一列一列地来看,我们
一行一行地来看,
一个棋子占据一行,其实就是第
那么还剩下
但其实还有一个问题(困扰了我很久):
如果
转移从左往右数的第
这些棋子显然不会占据第
怎么解决呢?
显然只有
时间复杂度
三、完整代码:
1 #include<iostream> 2 #define N 2010 3 using namespace std; 4 int a,b,c,d,k; 5 int s[N],f[N][N]; 6 int main() 7 { 8 cin>>a>>b>>c>>d>>k; 9 for(int i=1;i<=a;i++) s[i+c]+=b; 10 for(int i=0;i<=a+c;i++) s[i]+=d+1,f[i][0]=1; 11 for(int i=1;i<=a+c;i++) 12 for(int j=1;j<=k;j++) 13 f[i][j]=(f[i-1][j-1]*(s[i]-j)+f[i-1][j])%M; 14 cout<<f[a+c][k]<<'\n'; 15 return 0; 16 }
四、写题心得:
好了,总算把这题想明白了,状态转移方程也是自己推的。很好,加油!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】