POJ 3735 Training little cats 动态规划(矩阵的幂)

一、题目大意

我们有N只猫,每次循环进行K次操作(N<=100,K<=100),每次操作可有以下三种选择:

1、g i 给第i只猫1个食物

2、e i 让第i只猫吃完它所有的食物

3、s i j 交换第i和j只猫的食物。

求出M次循环后,每只猫有多少个食物?(M<=1000000000)

二、解题思路

假设已经循环过 w 次,设第i只猫的食物数量为 ai

设循环过 w+1 次,第 i 只猫的食物数量为 bi。

不难1次循环的k个操作后,bi = a1 * m1 + a2 * m2 + a3 * m3 + ... an * mn + C

所以可推出以下的矩阵成立

同时当 ai 和 bi 之间相差M次循环时,也有如下表达式成立。

考虑下初始的情况,一开始每只猫都没有食物,设 Si 为 M次循环后第 i 只猫的数量,把初值代入 a1 .. an,有如下表达式成立。

但是这样我们需要使用 101 * 101大小的矩阵进行相乘,而且本题目需要开long long。

但经过思考,发现可以把矩阵降低一维成为100。

我们可以发现矩阵M次方的规律。

1、 对于矩阵中 1 <= 1 <= N,我们发现 这些值不管成多少次,都与第M+1行和N+1列无关。

2、最后一行始终不变。

3、对于最后一列,我们发现它可以通过如下表

达式。在100 * 100的复杂性内计算。

设进行经过i次循环的最后一列为Ci。对于最后一列的第 j 行则有如下表达式。

维护4个滑动数组,计算每一次更新内圈的后,再更新最后一列的值,M次操作后,最后一列的值就是答案,因为M次次幂即可求解答案。(初始时每只小鼠没有食物,最一列开long long,中间开int即可)。

三、代码

#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
int P[2][107][107], B[107][107];
ll _P[2][107], _B[107];
int N, M, K;
void pow(int _N)
{
    int cnt = 0;
    while (_N > 0)
    {
        int crt = cnt & 1, nxt = !(cnt & 1);
        if (_N & 1)
        {
            for (int i = 0; i < N; i++)
            {
                _P[nxt][i] = _B[i];
                for (int j = 0; j < N; j++)
                {
                    _P[nxt][i] = _P[nxt][i] + ((ll)B[i][j]) * _P[crt][j];
                    P[nxt][i][j] = 0;
                    for (int k = 0; k < N; k++)
                    {
                        P[nxt][i][j] = P[nxt][i][j] + B[i][k] * P[crt][k][j];
                    }
                }
            }
            for (int i = 0; i < N; i++)
            {
                _B[i] = _P[nxt][i];
                for (int j = 0; j < N; j++)
                {
                    B[i][j] = P[nxt][i][j];
                }
            }
        }
        for (int i = 0; i < N; i++)
        {
            _P[nxt][i] = _P[crt][i];
            for (int j = 0; j < N; j++)
            {
                _P[nxt][i] = _P[nxt][i] + ((ll)P[crt][i][j]) * _P[crt][j];
                P[nxt][i][j] = 0;
                for (int k = 0; k < N; k++)
                {
                    P[nxt][i][j] = P[nxt][i][j] + P[crt][i][k] * P[crt][k][j];
                }
            }
        }
        cnt++;
        _N >>= 1;
    }
}
void solve()
{
    for (int i = 0; i < 101; i++)
    {
        for (int j = 0; j < 101; j++)
        {
            B[i][j] = P[0][i][j] = P[1][i][j] = 0;
        }
        B[i][i] = 1;
        P[0][i][i] = 1;
        _P[0][i] = 0;
        _B[i] = 0;
    }
    char c;
    int a, b;
    for (int i = 0; i < K; i++)
    {
        scanf("\n%c", &c);
        if (c == 'g')
        {
            scanf("%d", &a);
            _P[0][a - 1]++;
        }
        else if (c == 's')
        {
            scanf("%d%d", &a, &b);
            for (int j = 0; j < N; j++)
            {
                int tmp = P[0][a - 1][j];
                P[0][a - 1][j] = P[0][b - 1][j];
                P[0][b - 1][j] = tmp;
            }
            ll tmpL = _P[0][a - 1];
            _P[0][a - 1] = _P[0][b - 1];
            _P[0][b - 1] = tmpL;
        }
        else if (c == 'e')
        {
            scanf("%d", &a);
            for (int j = 0; j < N; j++)
            {
                P[0][a - 1][j] = 0;
            }
            _P[0][a - 1] = 0;
        }
    }
    pow(M);
    for (int i = 0; i < N; i++)
    {
        printf("%lld%c", _B[i], i + 1 == N ? '\n' : ' ');
    }
}
int main()
{
    while (true)
    {
        scanf("%d%d%d", &N, &M, &K);
        if (N == 0 && M == 0 && K == 0)
        {
            break;
        }
        solve();
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/229057.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年江苏省职业院校技能大赛信息安全管理与评估 第二阶段学生组(样卷)

2024年江苏省职业院校技能大赛信息安全管理与评估 第二阶段学生组&#xff08;样卷&#xff09; 竞赛项目赛题 本文件为信息安全管理与评估项目竞赛-第二阶段样题&#xff0c;内容包括&#xff1a;网络安全事件响应、数字取证调查、应用程序安全。 本次比赛时间为180分钟。 …

104. 二叉树的最大深度(Java)

目录 解法&#xff1a; 官方解答&#xff1a; 方法一&#xff1a;深度优先搜索 方法二&#xff1a;广度优先搜索 思路与算法 复杂度分析 时间复杂度&#xff1a; 空间复杂度&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根…

N卡、A卡能合体了,双卡“交火”游戏帧率暴涨200%

如果你混迹 PC 圈有些年头&#xff0c;一定听说过显卡「交火」这个直觉上很猛的操作。 双卡、三卡、四卡…有几张就「叠加」几倍的效果可比单张升级更让人兴奋。 然而&#xff0c;不管是 NVIDIA SLI 还是 AMD CrossFire 这几年都在了大众视野消失了。 原因很简单&#xff0c;…

611.有效的三角形个数

1.题目解析 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 补充&#xff1a; 1.三角形的判断&#xff1a;假设有三条边按大小排序&#xff1a; 2.题目示例 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用…

os.walk()遍历文件夹/文件

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

xcode ——Instrumets(网络连接调试)使用

环境&#xff1a; instruments 使用只能在真机调试时使用&#xff0c;且真机系统必须ios15 点击debug 按钮——Network——Profile in Instruments 然后就可以看到如下面板 展开运行的项目&#xff0c;点击session下的域名&#xff0c;下方回出现该域名下的网络请求。点击Deve…

使用 GROUP BY 进行数据库分析:以图书销售数据库为例

让我们通过一个简单但实用的例子来理解 GROUP BY 的使用。我们将以一个图书销售数据库为例。这个数据库包含两张表&#xff1a;一张是图书信息表 (books)&#xff0c;另一张是销售记录表 (sales)。我们会先创建这两张表&#xff0c;然后插入一些数据&#xff0c;并展示如何使用…

算法:常见的哈希表算法

文章目录 两数之和判断是否互为字符重排存在重复元素存在重复元素字母异位词分组 本文总结的是关于哈希表常见的算法 哈希表其实就是一个存储数据的容器&#xff0c;所以其实它本身的算法难度并不高&#xff0c;只是利用哈希表可以对于一些场景进行优化 两数之和 class Solut…

openEuler学习05-ssh升级到openssh-9.5p1

openEuler的版本是openEuler 20.03&#xff0c;ssh的版本是OpenSSH_8.2p1 [roottest ~]# more /etc/os-release NAME"openEuler" VERSION"20.03 (LTS-SP3)" ID"openEuler" VERSION_ID"20.03" PRETTY_NAME"openEuler 20.03 (LTS-…

单例模式---饿汉式、懒汉式

一、什么是单例模式 单例模式&#xff0c;指的是一个类中的对象只能有一个&#xff0c;它在内存中只会创建一次对象的设计模式。 二、饿汉式 public class SingleTon {// 私有的构造方法private SingleTon() {};// 1. 饿汉式private static SingleTon instance new SingleTon…

UE Websocket笔记

参考链接 [UE4 C入门到进阶]12.Websocket网络通信 - 哔哩哔哩 包含怎么用Nodejs 写测试服务器 UE4_使用WebSocket和Json&#xff08;上&#xff09; - 知乎 包含Python写测试服务器 UE4_使用WebSocket和Json&#xff08;下&#xff09; - 知乎 示例代码 xxx.Build.cs"W…

思伟老友记 | 晋江市尚亿建材实业有限公司携手思伟软件16年

晋江市尚亿建材实业有限公司 晋江市尚亿建材实业有限公司成立于2006年&#xff0c;建有两个混凝土搅拌站&#xff0c;是晋江市成立时间最长的搅拌站之一。目前拥有25部搅拌车&#xff0c;5部泵送车&#xff0c;3部装载机&#xff0c;混凝土年产量超过50万m。 思伟软件与尚亿公…

土壤水分测量仪QY-800S多层一体化监测土壤墒情

产品概述&#xff1a; 土壤水分测量仪又名非接触式土壤水分测量仪、土壤墒情测量仪&#xff0c;是一款以介电常数检测原理为基础的传感器。能够针对不同土层的土壤水分含量进行动态观测&#xff0c;而且是进行快速、准确、全面地观测&#xff0c;让人们实现对土壤的高度感知。 …

freeswitch编译mod_av支持webrtc MCU通话

系统环境 一、FS相关网站 二、第三方库安装 1.apt安装 2.指定版本sofia-sip安装 3.指定版本spandsp安装 4.指定版本libks安装 5.指定版本openssl安装 三、指定版本FS安装 1.CPPFLAGS配置 2.编译器版本 3.FS配置编译 四、FS&#xff0c;fs_cli运行&#xff0c;模块加载 附录 1.安…

软考2018下午第六题改编逻辑(状态模式)

在状态模式中&#xff0c;我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象 package org.example.状态模式.软考航空;/*** author lst* date 2023年12月07日 15:37*/ class FrequentFlyer {CState state;double flyMiles;public FrequentFlyer() {…

官方版小白重装系统之制作装机U盘篇

一、前言 很多人会安装电脑的操作系统&#xff0c;也有很多人不会安装&#xff0c;甚至还要花时间花金钱找人安装。 网上重装系统的网站很多&#xff0c;安装系统的工具软件也很多&#xff0c;其中不乏捆绑有病毒木马、广告间谍的&#xff0c;很多人深受其害&#xff0c;那为什…

Navicat Premium 16 for Mac/Windows:高效的数据库开发工具

Navicat Premium 16是一款功能强大的数据库开发工具&#xff0c;为开发人员提供了全面的工具和功能&#xff0c;帮助他们更高效地进行数据库开发和管理。不论是初学者还是专业开发人员&#xff0c;Navicat Premium 16都能满足他们的需求&#xff0c;并提供直观、易用的界面。 …

智汇恒星科技|控乐屋.全宅智能冠军代言来啦, 智慧家居千亿蓝海

随着5G、大数据、云计算、物联网等技术的发展&#xff0c;智能化正覆盖人们生活的方方面面&#xff0c;全屋智能的出现为“一键式”智能家居生活享受提供无限可能。近年来智能家居行业总体规模增长迅速&#xff0c;数据显示&#xff0c;2022年中国智能家居行业市场规模约为6200…

应用架构——集群、分布式、微服务的概念及异同

一、什么是集群&#xff1f; 集群是指将多台服务器集中在一起&#xff0c; 每台服务器都实现相同的业务&#xff0c;做相同的事&#xff1b;但是每台服务器并不是缺 一不可&#xff0c;存在的主要作用是缓解并发能力和单点故障转移问题。 集群主要具有以下特征&#xff1a; …

粤能环保亮相迪拜COP28,智能技术铸就运河城市可持续未来

在全球应对气候变化的重要会议——迪拜COP28大会上&#xff0c;运河城市面临的独特环境挑战引起了广泛关注。随着城市化进程的加快&#xff0c;运河城市在处理固体废物、减少温室气体排放以及维持水资源安全方面面临着严峻考验。智能垃圾分类作为应对这些挑战的有效途径&#x…