当前位置: 首页 > news >正文

蓝桥杯ACwing习题

题目 :https://www.acwing.com/problem/content/4409/

解析 :根据题目我们可以知道 问的是方案数 那么首先就想到了 dp 仔细想一下 发现类似于蒙德里安的梦想那道状态压缩的题 , 所以我们先考虑怎么定义 f[i][j] 
f[i][j] 表示的是 已经放了前 i 行 且第 i + 1 填满了  j 个格子 , 由此我们画图可以知道

f[i][0] = f[i - 1][2 ] + f[i - 1][0]
f[i][1] = f[i - 1][1]  + f[i - 1][0] * 2;
f[i][2] =  f[i - 1][0] +f[i - 1][1];

矩阵用于解决大数据问题

设Fi = { fi0 , fi1 , fi2};
Fi -1= { fi - 10 , fi - 11 , fi - 12}:
Fi- 1 * A  = Fi
由上面的可以得到 
A = 1 2 1
        0 1 1
        1 0  0
代码
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e7 + 10 , mod = 1e9 + 7;
typedef long long LL;

int dp[N][3]; // 已经放好了前 i 列 , 且第 i + 1 列放了 0 1 2 个的方案数 

void mul(LL f[] , LL a[] , LL b[][3])
{
       LL temp[3] = {0};
    
    for(int i = 0 ; i < 3 ; i ++)
      for(int j = 0 ; j < 3 ; j ++)
          temp[i] = (temp[i] + a[j] * b[j][i]) % mod;
          
    memcpy(f , temp ,sizeof temp);
}

void mul(LL a[3][3] , LL b[3][3] , LL c[3][3])
{
    LL temp[3][3] = {0};
    
    for (int i = 0; i < 3 ; i ++)
       for (int j = 0; j < 3 ; j ++)
         for (int k = 0; k < 3 ; k ++)
            temp[i][j] = (temp[i][j] + a[i][k] * b[k][j]) % mod;
    
    memcpy(a , temp , sizeof temp);
}

int main()
{
    int n;
    cin >> n;
    
    // 求 dp[n][0] ?
    n --;
    LL a[][3] =  {{ 1, 2, 1 },
                  { 0 ,1 ,1 },
                  { 1,0 ,0 }};
                
    LL f[] = {1 , 2 , 1};
    
    while (n)
    {
        if(n & 1) mul(f , f , a);
          n >>= 1;
        mul(a , a , a);
      
    }
    
    cout << f[0] << endl;
    
    return 0;
}
 

http://www.lryc.cn/news/251771.html

相关文章:

  • vue发送请求携带token,拼接url地址下载文件
  • 【PTA-C语言】编程练习3 - 循环结构Ⅱ
  • Google Chrome 下载 (离线版)
  • 2023年GopherChina大会-核心PPT资料下载
  • 从源代码出发,Jenkins 任务排队时间过长问题的解决过程
  • openssl 生成CA及相关证书
  • App测试之App日志收集及adb常用命令
  • 【Java面试——并发基础、并发关键字】
  • 如何使用 Java 在Excel中创建下拉列表
  • Python安装步骤介绍
  • 学习80min快速了解大型语言模型(ChatGPT使用)笔记
  • SQL错题集1
  • uniapp运行到安卓基座app/img标签不显示
  • vscode非常好用的扩展插件
  • 一文弄懂BFS【广度优先搜索(Breadth-First Search)】
  • 深度学习记录--logistic回归函数的计算图
  • Java基本数据类型详解
  • 第十五届蓝桥杯模拟赛(第二期)
  • 命令模式-C++实现
  • 3dMax拼图生成工具Puzzle2D使用教程
  • git报错invalid object xxx和unable to read tree xxxxxx
  • 会泽一村民上山放羊吸烟引发森林火灾,AI科技急需关注
  • docker-compose部署zabbix+grafana
  • ios 逆向分分析,某业帮逆向算法(二)
  • openCv颜色矩
  • 〖大前端 - 基础入门三大核心之JS篇㊹〗- DOM事件委托
  • 正是阶段高等数学复习--函数极限的计算
  • Linux-usb触摸板去除鼠标箭头
  • 【微信小程序】英文字母不换行问题 flex布局字符超出宽度折行问题:设置了word-break: break-all;和flex: 1;冲突flex不生效问题
  • python--自动化办公(Word)