十一届蓝桥杯省赛B组c/c++ 试题E 矩阵

在这里插入图片描述

dfs肯定跑不出来 这种一般都是动态规划
左边的数小 上边的数小
从小到大 对于每个新的数 要么紧挨着放在上边一行 要么紧挨着放在下边一行
放在上面当然没有问题
如果放在下边,前提需要上边有数才行,所以不能出现下面个数大于上面个数的情况

dp【i】【j】:上边i个数,下边一行j个数的可能的情况数
递推公式dp【i】【j】=dp【i-1】【j】+dp【i】【j-1】 (i大于等于j)

初始化边界:dp【0】【0】=1 上边一行和下边一行都没数的情况算一种

一个新的数 dp【i】【j】
放在上边 dp【i】【j】+= dp【i-1】【j】
放在下边 dp【i】【j】+= dp【i】【j-1】

填完这个 1010*1010 的表最后的 dp【1010】【1010】就是答案

#include <iostream>
using namespace std; 
int f[1020][1020];
int main()
{
    f[0][0]=1; 
    for(int i=1;i<=1010;i++)//上面一行可以放1~1010个
        for(int j=0;j<=i;j++)//下面一行放的范围是0~i 不能比上面多哦
        {
               f[i][j]+=f[i-1][j]%2020;//可以把i+j这个数紧挨着放上面
            if(j)
               f[i][j]+=f[i][j-1]%2020;//也可以放下面 注意不要越界
        }
    cout<<f[1010][1010]<<endl; 
    return 0;
 }
#include <iostream>
using namespace std;

int f[1020][1020];
int main(){
    f[0][0]=1;                                   
    for(int i=0;i<=1010;i++)
        for(int j=0;j<=1010;j++){
            if(i-1>=j)//上边一行的数要多于下边一行 才能往上边放                     
            	f[i][j]+=f[i-1][j]%2020;
            if(j)
            	f[i][j]+=f[i][j-1]%2020;
        }
        
    cout<<f[1010][1010]<<endl;   
    return 0;
}
  • 12
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值