[week14] E - Q老师度假(选做)—— 矩阵快速幂优化DP(拓展)

2023-05-16

文章目录

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

题意

忙碌了一个学期的 Q老师 决定奖励自己 N 天假期。

假期中不同的穿衣方式会有不同的快乐值。

已知 Q老师 一共有 M 件衬衫,且如果昨天穿的是衬衫 A,今天穿的是衬衫 B,则 Q老师 今天可以获得 f[A][B] 快乐值。

在 N 天假期结束后,Q老师 最多可以获得多少快乐值?

Input

输入文件包含多组测试样例,每组测试样例格式描述如下:

第一行给出两个整数 N M,分别代表假期长度与 Q老师 的衬衫总数。(2 ≤ N ≤ 100000, 1 ≤ M ≤ 100)

接下来 M 行,每行给出 M 个整数,其中第 i 行的第 j 个整数,表示 f[i][j]。(1 ≤ f[i][j] ≤ 1000000)

测试样例组数不会超过 10。

Output

每组测试样例输出一行,表示 Q老师 可以获得的最大快乐值。

输入样例

3 2
0 1
1 0
4 3
1 2 3
1 2 3
1 2 3

输出样例

2
9

提示


分析

这也是一道用矩阵快速幂优化DP解决的问题,但是有所变型。


  • 矩阵快速幂变型

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

所有的快速幂计算都是基于该运算满足结合律这一特性之上。

例如快速加、快速乘,包括快速幂。只有满足结合律才能利用幂计算优化计算时间,否则不能将一个计算式子进行拆分和重组。

假设一个新定义的运算需要用快速计算来实现优化,则只要其满足结合律,就可以尝试。

那么在矩阵快速幂中,若矩阵乘法运算(即结果矩阵中每一个元素等于乘数矩阵与被乘数矩阵中一行和一列中每个元素乘积之和)替换为新的运算后,矩阵之间运算仍然满足结合律,则矩阵快速幂依然成立。

建议在使用变型时手动验证是否符合结合律。


  • 题目分析

这道题就是需要对运算进行变型的一个例子。

根据题意:

(1)定状态
在这里插入图片描述
(2)转移方程
在这里插入图片描述
(3)矩阵快速幂转换
在这里插入图片描述
(4)矩阵运算变型

显然,f[i][j] = max(H[k][j] + f[i - 1][k]),而不是(H[1][j] * f[i - 1][1] + … + H[m][j] * f[i - 1][m] )

即所得结果矩阵中每一个元素等于乘数矩阵与被乘数矩阵中一行和一列中每个元素相加之和中的最大值:
在这里插入图片描述

经验证,变型后的矩阵仍然满足结合律,因此同样可以使用矩阵快速幂进行优化。

(5)单位矩阵变型

在每个快速计算中,起始值都设置为单位元。

在加法中为0,乘法中为1,矩阵中为单位矩阵。

这些单位元都有一个特性,也就是它们一定不会影响之后的运算,不会对运算结果产生影响。

一个简单的验证方法就是,将单位元与任何数值a进行对应的运算,a都不变。

在这道题中,所求的是所有和的最大值。因此将矩阵中所有元素都设置为0一定不会对结果产生影响,因为另一个矩阵中的任意元素与0相加仍然等于0,矩阵本身不会发生变化,因此最大值也不会改变。


总结

  1. 数学证明规律总是最难的👋
  2. 幂快速计算一定要注意单位元

代码

//
//  main.cpp
//  lab5
//
//  Created by 王黎杉 on 2020/7/6.
//

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;

int n = 0,m = 0;

struct Matrix           //累乘矩阵结构体
{
    long long x[101][101];      //矩阵
    
    Matrix operator*(const Matrix & t) const        //重载矩阵乘法
    {
        Matrix ans;
        for( int i = 0 ; i < m ; i++ )
            for( int j = 0 ; j < m ; j++ )
            {
                ans.x[i][j] = 0;
                
                for( int k = 0 ; k < m ; k++ )      //修改矩阵计算:原本为累加乘积,改为选出一行中最大和
                    ans.x[i][j] = max(ans.x[i][j],x[i][k] + t.x[k][j]);
                
            }
        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));    //新的运算中,基本矩阵应该为全零
   
   while (num)                  //累乘
   {
       if( num & 1 )
           ans = ans * t;
       
       t = t * t;
       
       num >>= 1;
       
   }
   
   return ans;
}

int main()
{
    ios::sync_with_stdio(false);
    

    
    while( cin>>n>>m )
    {
        Matrix clothes;
        
        
        for( int i = 0 ; i < m ; i++ )              //输入矩阵
            for( int j = 0 ; j < m ; j++ )
                cin>>clothes.x[i][j];
        
        Matrix f = quick_pow(clothes, n - 1);       //累乘
        
        long long ans = 0;
        
        for(int i = 0 ; i < m ; i++ )               //所有元素中的最大值即为答案
            for(int j = 0 ; j < m ; j++ )
                ans = max(ans,f.x[i][j]);
        
        cout<<ans<<endl;
        
    }
    
    return 0;
}



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

[week14] E - Q老师度假(选做)—— 矩阵快速幂优化DP(拓展) 的相关文章

随机推荐

  • 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 每一块砖需要
  • [week14] E - Q老师度假(选做)—— 矩阵快速幂优化DP(拓展)

    文章目录 题意InputOutput输入样例输出样例提示 分析总结代码 题意 忙碌了一个学期的 Q老师 决定奖励自己 N 天假期 假期中不同的穿衣方式会有不同的快乐值 已知 Q老师 一共有 M 件衬衫 xff0c 且如果昨天穿的是衬衫 A