问题描述
把 1 ∼ 2020 放在 2 × 1010 的矩阵里。
要求同一行中右边的比左边大,同一列中下边的比上边的大。一共有多少种方案?
答案很大,你只需要给出方案数除以 2020 的余数即可。
答案提交
这是一道结果填空题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:1340
思路
这一题是个动态规划题, DP[i][j]表示第一层有i个数,第二层有j个数有多少种方案
题目要求同一行中右边比左边大, 同一列中下边比上边的大,所以 j <= i
1.当j < i时, DP[i][j]可以用此时少一个数的方案来表示,少一个数可以是DP[i - 1][j],也可以是DP[i][j - 1],
DP[i][j] = DP[i - 1][j] + DP[i][j - 1]
2.当j = i时, 因为要求,所以
DP[i][j] = DP[i][j - 1]
#include <stdio.h>
int DP[1011][1011];
int main()
{
int i, j;
DP[1][0] = 1;
for (i = 1; i <= 1010; i++) DP[i][0] = 1;//初始化
for (i = 1; i <= 1010; i++) {
for (j = 1; j <= i; j++) {
if (i == j) DP[i][j] = DP[i][j - 1];
else DP[i][j] = (DP[i - 1][j] + DP[i][j - 1]) % 2020;
}
}
printf("%d", DP[1010][1010]);
return 0;
}