问题描述
把 1 ∼ 2020 放在 2 × 1010 的矩阵里。
要求同一行中右边的比左边大,同一列中下边的比上边的大。一共有多少种方案?
答案很大,你只需要给出方案数除以 2020 的余数即可。
答案提交
这是一道结果填空题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:1340
分析
要放当前数字并使其递增,只能放两个位置,就是第一行最右边的空格处和第二行最右边的空格处。
动态规划
f[i][j] 表示第一行有i个数,第二行有j个数的方式总数。
方程式:
f[ i ] [ j ] += f[i - 1][ j ] , f[ i ] [ j ] += f [ i ] [ j - 1 ] ,
表示第一行有i个数第二行有j个数,可以由两种方式得到:
第一种:当第一行有i-1个数,第二行有j个数时,在第一行添加一个数就可以得到f[i][j]。
第一种:当第一行有i个数,第二行有j-1个数时,在第二行添加一个数就可以得到f[i][j]。
package 蓝桥杯.蓝桥第十一届省赛.矩阵;
public class Solution {
public static void main(String[] args) {
int[][] dp = new int[1011][1011];
dp[0][0] = 1; //设置初始值,一二行都不放数字时是一种方式。
for (int i = 0; i <= 1010; i++) {
for (int j = 0; j <= 1010 && j<=i; j++) {
// 加IF判断指针不为负数
if (i-1>=0){
dp[i][j] += dp[i-1][j];
}
if (j-1>=0){
dp[i][j] += dp[i][j-1];
}
dp[i][j] %= 2020;//对结果取模
}
}
System.out.println(dp[1010][1010]);
}
}