[USACO19DEC]Moortal Cowmbat G 真牛快打
水帖。。。
题目描述
Bessie 玩格斗游戏真牛快打已经有很长时间了。然而,最近游戏开发者发布了一项更新,这迫使 Bessie 改变她的打法。
游戏总共使用 M 个按键,标记为前 M 个小写字母(1≤M≤26)。Bessie 在游戏中最喜欢的组合键是一个长为 N 的按键字符串 S(1≤N≤105)。然而,由于最近的更新,现在每种组合键必须由一些“连击”所组成,其中连击的定义为相同的按键连续按下至少 K 次(1≤K≤N)。Bessie想要修改她最喜欢的组合键,创造一个同样长为 N 的新组合键,然而这一新组合键由按键连击所组成,以适应规则的变化。
Bessie 需要消耗 aij 天来训练她在组合键中某个特定的位置用按键 j 来取代按键 i(也就是说,将 S 中的某个特定的字符由 i 变为 j 的代价为 aij)。注意有可能将按键 i 换成某种中间按键 k 然后再从按键 k 换成按键 j 会比直接从按键 i 换成按键 j 消耗更短的时间(或者更一般地说,可能有一条起点为 i 终点为 j 的更改路径给出了从按键 i 最终更改为按键 j 的最小总代价)。
帮助 Bessie 求出她创建一个满足新要求的组合键所需要的最小天数。
输入
输入的第一行包含 N,M 和 K。第二行包含 S,最后 M 行包含一个 M×M 的数字方阵 aij,其中 aij 为一个范围为 0…1000 的整数,并且对于所有的 i,有 aii=0。
输出
输出一个整数,表示 Bessie 将她的组合键改为一个满足新要求的新的组合键所需要的最小天数。
样例输入
5 5 2 abcde 0 1 4 4 4 2 0 4 4 4 6 5 0 3 2 5 5 5 0 4 3 7 0 5 0
样例输出
5
提示
【测试点性质】
测试点 2-4 满足 N≤1000,K≤50。
测试点 5-8 满足 N≤30,000,K≤50。
在这个例子中的最优方案是将 a 改为 b,将 d 改为 e,再将两个 e 都改为 c。这总共消耗1+4+0+0=5天,最终的组合键为 bbccc。
教练说这题炒鸡简单,所以就死命攻这道题,结果可想而知。。。0分潇洒退场
咳咳,接下来进入正解。
大致应该可以看出这是一道动态规划,那么问题来了,怎么个规划法???
读了三四次题目,不妨建立模型:
给定一个字符串和一个 M×M 的矩阵 a,表示可以消耗 ai,j 的代价把字符 i 改成字符 j,求把原字符串改成每个连续段长度都不小于 K 的最小代价。(洛谷大神)
其实不难,把f[i]看为使前i个字符符合条件的最小代价.
注意(细节重点):从提示中“d->e->c"中可以看出原字符矩阵的交换方法不一定是最优的(啊这),所以必须用floyd算法求出c[i][j]用来维护矩阵的最小值。
考虑dp:
f[i]表示前i个字符构成新的有效字符串的最小代价;
但是需要用掉一维的转移,所以时间复杂度是不够的。。。
那么就需要用sum进行预处理与前缀和优化。
定义:sum[i][j][k]表示把第i到第j个字符转化为第k个颜色的最小代价.
这样就有了O(1)的转移.
则f[i] = min{f[j] + sum[i][j][k] | j <= i - k, k <= m}
完事~~
~~~~~~~~~~~~~~~~~~~~~~~我是分界线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
你们最爱的代码来喽~
#include<bits/stdc++.h>using namespace std;char s[100006];
int n, m, k, c[32][32], sum[32][100006], t[32], f[100006];int main(){scanf("%d%d%d", &n, &m, &k);scanf("%s", s + 1);for(int i = 0; i < m; i++)for(int j = 0; j < m; j++)scanf("%d", &c[i][j]);for(int l = 0; l < m; l++)for(int i = 0; i < m; i++)for(int j = 0; j < m; j++)if(i != j && j != l && i != l)c[i][j] = min(c[i][j], c[i][l] + c[l][j]);for(int i = 0; i < m; i++)for(int j = 1; j <= n; j++)sum[i][j] = c[s[j] - 'a'][i] + sum[i][j - 1];memset(t, 0x3f, sizeof(t));memset(f, 0x3f, sizeof(f));f[0] = 0;for(int i = k; i <= n; i++)for(int j = 0; j < m; j++)t[j] = min(t[j] + c[s[i] - 'a'][j], f[i - k] + (sum[j][i] - sum[j][i - k])), f[i] = min(t[j], f[i]);printf("%d\n", f[n]);/*for(int i = 0; i < m; i++){for(int j = 0; j < m; j++) cout<<c[i][j]<<" ";cout<<endl;}for(int i = 0; i < m; i++){for(int j = 1; j <= n; j++)cout<<sum[i][j]<<" ";cout<<endl;}*/return 0;
}
点个赞呗~~~
[USACO19DEC]Moortal Cowmbat G 真牛快打相关推荐
- 关于TxQBService报的错,腾讯你真牛B啊
腾讯你真牛B啊,浏览器都7了,还特么的报这么低级的错误,还每10秒写一条windows日志,让人有什么心情用你的浏览器,滚. 转载于:https://www.cnblogs.com/Sabre/p/3 ...
- 推荐一个小日本做的网站,超强震撼,创意绝对棒,真牛
推荐一个小日本做的网站,超强震撼,创意绝对棒,真牛 http://www.chihwaseon.com/english/frame_main.html 感觉是网上继"闲人之墓"后最 ...
- 空间三角形_玄关三角形沙发不靠墙,这设计真牛,直接解决无玄关空间少的问题...
玄关三角形沙发不靠墙,这设计真牛,直接解决无玄关空间少的问题 玄关是现在家居中比较常见的区域,一般情况下,家家户户进门位置都会有一个小玄关,更换鞋帽比较方便.不过有的户型也没有玄关,这种格局在设计的时 ...
- 只需两行代码,2080Ti 就能当 V100用,这个炼丹神器真牛!
作者 | 陈大鑫.青暮 话说人工智能江湖门派众多且繁杂,好似那大脑中的神经网络一般,但繁杂中却仍然有着一统的迹象...... 许久之前,ML派坐落美利坚合众山中,百年来武学奇才辈出,隐然成江湖第一大名 ...
- fastjson jar包_经过性能对比,我发现温少的FastJson真牛。
前语:不要为了读文章而读文章,一定要带着问题来读文章,勤思考.在此,建议大家为本公众号加"星标".如文章写得好,望大家阅读后在右下边"在看"处点个赞,以示鼓励! ...
- 去携程实习了!半年时间,从机械转行 Java,二哥的读者真牛逼!
大家好,我是二哥呀. 今天端午节,我带着老婆.女儿.妹妹来青岛了,高铁上,我们谈起了毕业后去哪里工作的话题.老读者应该知道了,我毕业后去的苏州,从个人情感上来说,我是非常喜欢苏州的,不仅景美,人也美, ...
- 真牛逼!我司用了7年的分布式锁方案...
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 提到数据一致性.操作原子性,诸如此类的一些与并发有关的词汇时不知道 ...
- 印度电工,真牛!上天入海,无所不能...
点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 来自:怪奇物语(ID:guaiqiwuyu) 原作者不详,如有版权问题请联系沟通 印 ...
- idea 编码扫描插件_用IDEA这样Review代码真牛逼
一个对项目负责的团队代码质量检查是必不可少的,有条件的团队经常有代码review习惯,这样可以使技术团队共同进步,但是一个庞大的工程做代码review其实是很麻烦的,所以就催生了很多的工具,今天我们就 ...
最新文章
- 刘宇凡:数字让切糕与电商溅起涟漪
- linux虚拟单用户数,Linux单用户模式
- Tableau系列之使用日期
- java代码轻量级锁_Java轻量级锁原理详解(Lightweight Locking)
- 原生JS封装自己的AJAX
- 如果央行加息,以前办的房贷利息也会涨吗?
- 操作系统核心原理-5.内存管理(下):段式内存管理
- 一年月份大小月口诀_怎么看自己的日柱 公式 推算口诀 最简便计算方法
- vscode安装live server
- 【Liunx】manjaro 配置vscode python开发环境
- java的for循环取出数据只是拿到最后一个_如何保证缓存与数据库双写的一致性...
- Java中IDEA,Springboot实现手机获取验证码和倒计时
- MATLAB实现SVM多分类(one-vs-rest),利用自带函数fitcsvm
- 使用一个运放滤三次谐波 二阶有源带通滤波器的电路设计及波形效果
- Texstudio安装后闪退|重装系统Windows10|texstudio2022
- 数据导入与预处理实验一---KETTLE数据处理
- 如何同时查询多个京东快递单号的物流状态、签收时间
- 按键式计算器——人机交互的变革
- 【JavaWeb】1—JavaWeb概述
- 华为机试-拼音翻译成阿拉伯数字