题目
解析
假如要将1~4按次序填入2*2的方格中,有如下两种方案:
这里有性质:填数时上面一行的列数一定大于等于下面一行的列数。因为我们是按从小到大的顺序填数的,这样才能保证同一列中下面一行的数要大于上面一行。
这里假设dp[i][j]为第一行放i个数,第二行放j个数的方案数,i的范围为0 ~ 1010,j的范围为0 ~ i。
求方案数:放置第n个数在i行j列的方案数,上一步可能是放第n-1个数在i-1行j列,或是放第n-1个数在i行j-1列:dp[i][j]=dp[i-1][j]+dp[i][j-1]
这里可以参考pat里 最短路径有多少条 的思想。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1020;
int dp[maxn][maxn];//填到dp[i][j]第1行有i个数,第二行有j个数的方案个数
int main()
{
dp[0][0]=1;
for(int i=0;i<=1010;i++)
{
for(int j=0;j<=i;j++)
{
if(i>=1 && j>=1) dp[i][j]=dp[i-1][j]+dp[i][j-1];
else if(i>=1 && j<1) dp[i][j]=dp[i-1][j];
else if(i<1 && j>=1) dp[i][j]=dp[i][j-1];
else dp[i][j]=1;
dp[i][j]=dp[i][j]%2020;
}
}
cout<<dp[1010][1010];
}