[week14] D - Q老师染砖(选做) —— 矩阵快速幂优化DP

2023-05-16

文章目录

  • 题意
    • Input
    • Output
    • 输入样例
    • 输出样例
    • 提示
  • 分析
  • 总结
  • 代码

题意

衣食无忧的 Q老师 有一天突发奇想,想要去感受一下劳动人民的艰苦生活。

具体工作是这样的,有 N 块砖排成一排染色,每一块砖需要涂上红、蓝、绿、黄这 4 种颜色中的其中 1 种。且当这 N 块砖中红色和绿色的块数均为偶数时,染色效果最佳。

为了使工作效率更高,Q老师 想要知道一共有多少种方案可以使染色效果最佳,你能帮帮他吗?

Input

第一行为 T,代表数据组数。(1 ≤ T ≤ 100)

接下来 T 行每行包括一个数字 N,代表有 N 块砖。(1 ≤ N ≤ 1e9)

Output

输出满足条件的方案数,答案模 10007。

输入样例

2
1
2

输出样例

2
6

提示


分析

这是一道用矩阵快速幂优化DP解决的问题。


  • 矩阵快速幂优化DP

1. 什么是矩阵快速幂优化DP?

回顾一下矩阵快速幂👉[week14] Q老师的考验——矩阵快速幂

在动态规划过程当中,利用矩阵快速幂对动态规划求解进行优化就是矩阵快速幂优化DP。

若列出的状态转移方程符合矩阵快速幂转换条件,则可以使用矩阵快速幂对动态求解进行优化。一般这样的动态规划题目中的状态涉及多个方程。

2. 经典题型

  • 染砖问题
    在这里插入图片描述

(1)定状态
在这里插入图片描述
易发现,可以利用A[i]表示答案
在这里插入图片描述

但是在染砖过程中,涉及到的状态不止是A[i]所代表的状态,还有两种情况。即红绿砖数量均为偶数的情况需要由红绿均为奇数和红绿中有一个为偶数转换而得。

(2)状态转移方程
在这里插入图片描述

根据题意可知,对于每一块砖有四种颜色的选项,其中只有红绿要求是全为偶数:

⚠️注意:数量为0同样视作是数量为偶数。

  • A[i]:
    • 若前i - 1块砖满足红绿都为偶数,则第 i 块砖颜色为蓝和黄时,i 块砖中的红绿砖数仍然都为偶数,则A[i] = A[i - 1] * 2
    • 若前i - 1块砖满足红绿其中一种为偶数,则第i块砖颜色为红或绿时(哪一个颜色为奇数选择哪一个),i块砖满足红绿砖数都为偶数,则A[i] = C[i - 1]
  • B[i]:
    • 若前i - 1块砖满足红绿都为奇数,则第 i 块砖颜色为蓝和黄时,i 块砖中的红绿砖数仍然都为奇数,则B[i] = B[i - 1] * 2
    • 若前i - 1块砖满足红绿其中一个为奇数,则第 i 块砖颜色为红或绿时(哪一个为偶数选择哪一个),i 块砖中的红绿砖数都为奇数,则B[i] = C[i - 1]
  • C[i]:
    • 若前i - 1块砖满足红绿都为奇数,则第 i 块砖颜色为红和绿时,i 块砖中的红绿砖数有一个为偶数,则C[i] = A[i - 1] * 2
    • 若前i - 1块砖满足红绿其中一个为奇数,则第 i 块砖颜色为蓝和黄时,i 块砖中的红绿砖数其中一个为奇数,则C[i] = C[i - 1] * 2
    • 若前i - 1块砖满足红绿都为奇数,则第 i 块砖颜色为蓝和黄时,i 块砖中的红绿砖数都为奇数,则C[i] = B[i - 1] * 2

(3)方程转换
在这里插入图片描述

根据矩阵快速幂的特征,该方程可以转化为:

累乘矩阵^(i - 1) 结果矩阵(令i = 1)*

累乘矩阵即为上图等式中与ans[i - 1]相乘的数字矩阵
结果矩阵即为上图等式中等于ans[i]的变量矩阵

令i = 1时,即代表只有一块砖的情况,则:
A[1] = 2
B[1] = 0
C[1] = 2

最后与i = 1的结果矩阵中相乘是因为ans[i]根据矩阵快速幂拆分后等于:

ans[i] = 累乘矩阵 * 累乘矩阵 * … * ans[1]

最终,ans[i] = A[i]


  • 题目分析

这道题就是典型的染砖问题,根据上述分析实现代码即可。

染砖问题在代码中,需要手动将累乘的数字矩阵输入创建,并且在得到累乘结果后,将累乘结果矩阵中的第一行与ans[1]相乘得到结果。

将ans[i]转换为矩阵快速幂进行求解是为了优化计算过程。但ans[i]等于A[i],其他两个状态是转移到A[i]过程中出现的其他状态。


总结

  1. 矩阵快速幂还挺好用的,但难点仍然在于DP分析,列出状态和方程。

代码

//
//  main.cpp
//  lab4
//
//

#include <iostream>
using namespace std;

const int n = 3;
long long p = 10007;        //模

struct Matrix           //累乘矩阵结构体
{
    long long x[n][n];      //矩阵
    
    Matrix operator*(const Matrix & t) const        //重载矩阵乘法
    {
        Matrix ans;
        for( int i = 0 ; i < n ; i++ )
            for( int j = 0 ; j < n ; j++ )
            {
                ans.x[i][j] = 0;
                
                for( int k = 0 ; k < n ; k++ )
                {
                    ans.x[i][j] += x[i][k] * t.x[k][j] % p;
                    ans.x[i][j] %= p;       //每个所得数都要模p,否则当累乘次数过大时会wa
                }
                
            }
        return ans;
    }
    
   //初始化和复制构造函数
    Matrix(){ memset(x, 0, sizeof(x)); }
    Matrix(const Matrix &t){memcpy(x, t.x, sizeof(x)); }
    
};

Matrix quick_pow(Matrix t,long long num)        //快速幂
{
   Matrix ans;
   
   memset(ans.x, 0, sizeof(ans.x));
   
   for( int i = 0 ; i < n ; i++ )       //累乘的基本单位为单位矩阵
       ans.x[i][i] = 1;                 //除对角线上全为1外,其余都为0
   
   while (num)                  //累乘
   {
       if( num & 1 )
           ans = ans * t;
       
       t = t * t;
       
       num >>= 1;
       
   }
   
   return ans;
}
   

int main()
{
    ios::sync_with_stdio(false);
    
    int t = 0,num = 0;
    cin>>t;
    
    while( t-- )
    {
        cin>>num;
        
        Matrix a;
        
        //累乘矩阵
        a.x[0][0] = 2;
        a.x[0][1] = 0;
        a.x[0][2] = 1;
        a.x[1][0] = 0;
        a.x[1][1] = 2;
        a.x[1][2] = 1;
        a.x[2][0] = 2;
        a.x[2][1] = 2;
        a.x[2][2] = 2;
        
        Matrix res = quick_pow(a, num - 1);     //累乘砖块数 - 1次
        
        cout<<(res.x[0][0] * 2 + res.x[0][2] * 2) % p<<endl;
        //再与只有1个砖块时的a[1]b[1]c[1]相乘,得到答案
       
        
    }
    
    return 0;
}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[week14] D - Q老师染砖(选做) —— 矩阵快速幂优化DP 的相关文章

随机推荐

  • 实验3  数据库综合查询

    实验3 数据库综合查询 一 实验目的 掌握SELECT语句的基本语法和查询条件表示方法 xff1b 掌握查询条件种类和表示方法 xff1b 掌握连接查询的表示及使用 xff1b 掌握嵌套查询的表示及使用 xff1b 了解集合查询的表示及使用
  • Ubuntu18安装mysql8.0

    一 删除mysql 5 7 卸载 sudo apt get remove mysql common sudo apt get autoremove purge mysql server 5 7 清理残留数据 dpkg l grep rc a
  • 将arduino uno的数据上传到云平台

    文章目录 将arduino uno的数据上传到云平台解决方案adruino uno方面代码esp8266 方面代码主函数阿里云sdkcpp部分函数头部分 将arduino uno的数据上传到云平台 解决方案 加一块esp8266的单片机 x
  • 华为IS-IS基础配置

    目录 一 原理概述 二 实验要求 三 实验拓扑 四 实验步骤 一 原理概述 1 IS IS xff1a Intermediate System to Intermediate System xff0c 中间系统到中间系统 2 链路状态协议
  • 基于markdown-it打造的markdown编辑器

    前言 markdown it是一个用来解析markdown的库 xff0c 它可以将markdown编译为html xff0c 然后解析时markdown it会根据规则生成tokens xff0c 如果需要自定义 xff0c 就通过rul
  • WiFi模块ESP-07s开发过程(学习笔记)

    目录 注意事项获取AT指令用到的指令通过返回的指令提取自己想要的信息 注意事项 转义字符 xff1a xff1a C中定义了一些字母前加 34 34 来表示常见的那些不能显示的ASCII字符 xff0c 如 0 t n等 xff0c 就称为
  • Vue3 table表格使用axios调用后端Api数据,统一返回格式

    1 安装axios npm install axios 2 封装axios span class token keyword import span span class token namespace axios span span cl
  • 关于C++的string字符串拼接问题(和“字符转字符串”问题有关)

    xff08 只有气到我肺都炸了的情况下我才可能废一些时间去写博客 xff08 主要是写一些气话 xff09 xff0c 但现在气消得差不多了我也骂不出什么话了 正文 1 字符串拼接分软拼接和硬拼接 xff08 软硬拼接 是我自己发明的词 实
  • [week2]化学——识别烷烃基

    文章目录 题意InputOutput输入样例输出样例 分析总结代码 题意 化学很神奇 xff0c 以下是烷烃基 假设如上图 xff0c 这个烷烃基有6个原子和5个化学键 xff0c 6个原子分别标号1 6 xff0c 然后用一对数字 a b
  • [week2]模拟OJ成绩排名系统(简易版)

    文章目录 题意InputOutput输入样例输出样例 分析总结代码 题意 题面宛如小作文233 程序设计思维作业和实验使用的实时评测系统 xff0c 具有及时获得成绩排名的特点 xff0c 那它的功能是怎么实现的呢 xff1f 我们千辛万苦
  • [week3]区间选点问题——贪心算法

    目录 题意InputOutput输入样例输出样例 分析总结代码 题意 数轴上有 n 个闭区间 a i b i 取尽量少的点 xff0c 使得每个区间内都至少有一个点 xff08 不同区间内含的点可以是同一个 xff09 Input 第一行1
  • [week3]区间覆盖问题——贪心算法

    目录 题意InputOutput输入样例输出样例提示 分析总结代码 题意 数轴上有 n 1 lt 61 n lt 61 25000 个闭区间 ai bi xff0c 选择尽量少的区间覆盖一条指定线段 1 t xff08 1 lt 61 t
  • [csp模拟1]咕咕东的奇遇——(一)

    目录 题意InputOutput输入样例输出样例提示 分析总结代码 题意 咕咕东是个贪玩的孩子 xff0c 有一天 xff0c 他从上古遗迹中得到了一个神奇的圆环 这个圆环由字母表组成首尾相接的环 xff0c 环上有一个指针 xff0c 最
  • Linux挂载镜像的一些命令

    Linux挂载镜像的一些命令 在Linux中 xff0c 可以用losetup命令来设置无分区空白镜像到loop设备上 xff0c 用kpartx 来kpartx映射分区的镜像到loop设备上 之后通过mount命令将loop设备与系统文件
  • [week5]平衡字符串——尺取法

    目录 题意InputOutput输入样例输出样例提示 分析总结代码 题意 一个长度为 n 的字符串 s xff0c 其中仅包含 Q W E R 四种字符 如果四种字符在字符串中出现次数均为 n 4 xff0c 则其为一个平衡字符串 现可以将
  • [csp模拟2]T4——咕咕东的奇妙序列

    文章目录 题意InputOutput输入样例输出样例提示 分析总结代码 题意 咕咕东 正在上可怕的复变函数 xff0c 但对于稳拿A Plus的 咕咕东 来说 xff0c 她早已不再听课 xff0c 此时她在睡梦中 突然想到了一个奇怪的无限
  • [week9]签到题(长凳)——贪心算法

    文章目录 题意InputOutput输入样例输出样例提示 分析总结代码 题意 SDUQD 旁边的滨海公园有 x 条长凳 第 i 个长凳上坐着 a i 个人 这时候又有 y 个人将来到公园 xff0c 他们将选择坐在某些公园中的长凳上 xff
  • [week14] Q老师与十字叉

    文章目录 题意InputOutput输入样例输出样例提示 分析总结代码 题意 Q老师 得到一张 n 行 m 列的网格图 xff0c 上面每一个格子要么是白色的要么是黑色的 Q老师认为失去了 十字叉 的网格图莫得灵魂 一个十字叉可以用一个数对
  • [week15] ZJM 与霍格沃兹 —— 字符串哈希

    文章目录 题意InputOutput输入样例输出样例提示 分析总结代码 题意 ZJM 为了准备霍格沃兹的期末考试 xff0c 决心背魔咒词典 xff0c 一举拿下咒语翻译题 题库格式 xff1a 魔咒 对应功能 背完题库后 xff0c ZJ
  • [week14] D - Q老师染砖(选做) —— 矩阵快速幂优化DP

    文章目录 题意InputOutput输入样例输出样例提示 分析总结代码 题意 衣食无忧的 Q老师 有一天突发奇想 xff0c 想要去感受一下劳动人民的艰苦生活 具体工作是这样的 xff0c 有 N 块砖排成一排染色 xff0c 每一块砖需要