类似于《算法进阶指南》杨老师的照相排列
f[i][j]每一维表示所放置的人数,即第一行放i个人,第二行放j个人的总方案集合
状态转移f[i][j]=f[i-1][j]+f[i][j-1];
表示将下一个人放在第一行或者放在第二行的方案,等价于去掉此人后的方案总数
#include<iostream>
using namespace std;
const int N=2000;
int f[N][N];
int main()
{
f[0][0]=1;
for(int i=0;i<=1010;i++)
{
for(int j=0;j<=min(1010,i);j++)
{
if(i==0&&j==0)continue;
if(i-1>=j)f[i][j]=(f[i][j]+f[i-1][j])%2020;
if(j)f[i][j]=(f[i][j]+f[i][j-1])%2020;
}
}
cout<<f[1010][1010];
}
牛逼