AcWing none. 十一届蓝桥杯7月B组——E矩阵

该博客介绍了如何使用动态规划解决一个矩阵排列问题,其中要求同一行中右边的数大于左边,同一列中下边的数大于上边。通过分析问题,确定状态转移方程,并给出C++代码实现。此题是经典题目Acwing271的简化版本。
摘要由CSDN通过智能技术生成

问题描述

把 1 ∼ 2020 放在 2 × 1010 的矩阵里。

要求同一行中右边的比左边大,同一列中下边的比上边的大。一共有多少种方案?

答案很大,你只需要给出方案数除以 2020 的余数即可。

答案提交

这是一道结果填空题,你只需要算出结果后提交即可。
本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

分析

由题意我们大概可以简要得到下图的信息。

在这里插入图片描述

A < C < D , A < B < D A<C<D, A<B<D A<C<DA<B<D

从上图示意中,我们可以发现A一定是最小的数。而与A相邻的B和C一定是仅小于A的两个数。例如:若A=1,那么D绝对不可能等于2

因此,对于每个数的放法,一定是从最左边开始的。

对于一个新放的数:

  • 要么紧挨着放在上边一行
  • 要么紧挨着放在下边一行

且对于第二种情况必然是建立在上边一行已经放置的情况之下。

这种后一个的放法,仅受前一个放法影响的问题,显然具备无后效性,可以用DP的思想思考它。

在这里插入图片描述

上述的 f[i][j] 表示第一行有 i 个数,第二行有 j 个数放法。

当我们要放一个数的时,合理放法(即: i - 1 ≥ j):

  • 若放第一行,那放法数就有f[ i-1 ][ j ]
  • 若放第二行,那放法数就有f[ i ][ j-1 ]

若出现以下情况 ( 即: i - 1 < j):

在这里插入图片描述

因为它是不合法的,所以方案数 f[i][j] = f[i][j-1]

f [ i ] [ j ] = { f [ i − 1 ] [ j ] + f [ i ] [ j − 1 ] , i − 1 ≥ j f [ i ] [ j − 1 ] , i − 1 < j f[i][j]= \begin{cases} f[i-1][j]+f[i][j-1],i-1≥j \\ f[i][j-1],i-1<j \end{cases} f[i][j]={f[i1][j]+f[i][j1]i1jf[i][j1]i1<j

代码

#include <bits/stdc++.h>

using namespace std;

int dp[1011][1011];

int main()
{
    dp[0][0] = 1; //两行一个数字都不放,也是一种方案
    for (int i = 0; i <= 1010; i ++)
        for (int j = 0; j <= 1010; j ++)
        {
            if(i - 1 >= j) //转移前的状态也要合法,即第一行的数量不小于第二行的数量
                dp[i][j] += dp[i - 1][j] % 2020;
            if(j)
                dp[i][j] += dp[i][j - 1] % 2020;
        }
    cout << dp[1010][1010] << endl;
    return 0;
}

这题其实是经典例题Acwing 271.杨老师的照相排列的简化版。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蓝桥杯Python B蓝桥杯编程大赛中的一个别,其中包含了多道编程题和填空题。\[1\]比赛总分为150分,题目涵盖了排列字母、寻找整数、纸张尺寸、位数排序、蜂巢、消除游戏、全排列的价值、技能升级、最长不下降子序列最优清零方案等多个题目。\[1\] 在试题B中,可以使用字符串的排序方法对字符串进行按字典序排序。例如,给定字符串s = 'WHERETHEREISAWILLTHEREISAWAY',可以使用sorted()函数对字符串进行排序,然后使用.join()方法将排序后的字符连接起来,得到按字典序排序后的字符串。\[2\] 在试题C中,小蓝手中有2023种不同面值的硬币,每种硬币的面值和数量都与其种类相同。硬币兑换机可以将两个新版硬币兑换成一个旧版硬币,小蓝可以使用已有的硬币进行任意次数的兑换。问题是要求使得最终小蓝手中不同面值硬币的最大数量达到最大。可以通过计算得到最大数量的硬币是多少。\[3\] 综上所述,蓝桥杯Python B是一个编程大赛的别,其中包含了多个题目,涵盖了不同的编程技巧和问题。 #### 引用[.reference_title] - *1* *2* [第十三届蓝桥杯Python 大学B真题详解](https://blog.csdn.net/qq_52007481/article/details/124645738)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [2023第十四届蓝桥杯Python大学生B真题?(真题+附链接)](https://blog.csdn.net/m0_74939018/article/details/130200172)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值