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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据分析实战】酒店行业华住集团门店分布与评分多维度分析

文章目录 1. 写在前面2. 数据集展示3. 多维度分析3.1 门店档次多元化&#xff1a;集团投资战略观察3.1.1 代码实现3.1.2 本人浅薄理解 3.2 门店分布&#xff1a;各省市分布概览3.2.1 代码实现3.2.2 本人浅薄理解 3.3 门店分级评分&#xff1a;服务水平的多维度观察3.3.1 代码实…

Django的logging-日志模块的简单使用方法

扩展阅读&#xff1a; Python-Django的“日志功能-日志模块(logging模块)-日志输出”的功能详解 现在有下面的Python代码&#xff1a; # -*- coding: utf-8 -*-def log_out_test(content_out):print(content_out)content1 "i love you01" log_out_test(content1)现…

【数据结构】插入排序,希尔排序,选择排序,堆排序,冒泡排序

1.插入排序 思路&#xff1a;插入排序将一个数插入一个有序的数组里面&#xff0c;将这个数和数组元素挨着比较&#xff0c;直到他插入到合适的位置。 动画演示&#xff1a; 步骤&#xff1a;1.定义一个变量tmp保存要插入的数据 2.在循环中用tmp和有序数组中的元素比较&#…

Filed II 绘制超声 3D/2D 点扩散函数

点扩散函数可以较好地描述超声对成像目标分辨能力,利用 filed II 仿真工具实现点扩算函数 PSF 的 3D 和 2D 绘制。 定义换能器基本参数 f0=5e6; % Transducer center frequency [Hz] fs=100e6; % Sampling frequency [Hz] c=1540; % Speed of sound [m/s] width=0.15/1000

机器人刚性碰撞任务的阻抗控制性能

问题描述 对于机器人刚性碰撞任务&#xff0c;阻抗控制可以有效地提高机器人的适应性和稳定性。 在刚性碰撞任务中&#xff0c;机器人在接触外部物体时需要快速适应并调整自身的运动轨迹和速度&#xff0c;以实现精确的操控和稳定的交互。阻抗控制可以通过调整机器人的阻抗参…

是谁还没玩AI扩图?快跟上节奏啦

最近&#xff0c;抖音上的AI扩图突然火了&#xff0c;看完真的让人笑掉大牙&#xff5e;&#xff5e;&#xff5e; 这一热议的话题#AI扩图#在短视频平台抖音上的播放量已经突破7.8亿次&#xff0c;而相关的讨论也如同星火燎原&#xff0c;迅速点燃了公众的好奇心。从“用AI扩图…

AR + 通信,虚实结合让工作协同从线上到「现场」

在数字经济无所不在的当下&#xff0c;千行百业都与数智化办公接轨并因其实现转型升级。关注【融云 RongCloud】&#xff0c;了解协同办公平台更多干货。 升级的背后&#xff0c;是利用技术把工作用更自然的方式连接起来&#xff0c;让整个工作流协同更顺、体验更好。 而其中…

Linux常用命令——arpwatch命令

在线Linux命令查询工具 arpwatch 监听网络上ARP的记录 补充说明 arpwatch命令用来监听网络上arp的记录。 语法 arpwatch(选项)选项 -d&#xff1a;启动排错模式&#xff1b; -f<记录文件>&#xff1a;设置存储ARP记录的文件&#xff0c;预设为/var/arpwatch/arp.d…

数学建模-数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度

数据新动能驱动中国经济增长的统计研究-基于数字产业化和产业数字化的经济贡献测度 整体求解过程概述(摘要) 伴随着数据要素化进程的不断加深&#xff0c;对于数据如何作用于经济发展&#xff0c;数据与其他要素结合产生的动能应该如何测度的研究愈发重要。本文将数据新动能分…

C语言 扫雷游戏

代码在一个项目里完成&#xff0c;分成三个.c.h文件(game.c,game.h,main.c) 在Clion软件中通过运行调试。 /大概想法/ 主函数main.c里是大框架(菜单,扫雷棋盘初始化&#xff0c;随机函数生成雷&#xff0c;玩家扫雷) game.h函数声明(除main函数和游戏函数外的一些函数声明) ga…

SIMULINK 单相半波整流电路仿真

SIMULINK 单相半波整流电路仿真 去除毛刺&#xff0c;改步长 光滑如下&#xff1a;

JS中call()、apply()、bind()改变this指向的原理

大家如果想了解改变this指向的方法&#xff0c;大家可以阅读本人的这篇改变this指向的六种方法 大家有没有想过这三种方法是如何改变this指向的&#xff1f;我们可以自己写吗&#xff1f; 答案是&#xff1a;可以自己写的 让我为大家介绍一下吧&#xff01; 1.call()方法的原理…