水帖。。。

题目描述

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 真牛快打相关推荐

  1. 关于TxQBService报的错,腾讯你真牛B啊

    腾讯你真牛B啊,浏览器都7了,还特么的报这么低级的错误,还每10秒写一条windows日志,让人有什么心情用你的浏览器,滚. 转载于:https://www.cnblogs.com/Sabre/p/3 ...

  2. 推荐一个小日本做的网站,超强震撼,创意绝对棒,真牛

    推荐一个小日本做的网站,超强震撼,创意绝对棒,真牛 http://www.chihwaseon.com/english/frame_main.html 感觉是网上继"闲人之墓"后最 ...

  3. 空间三角形_玄关三角形沙发不靠墙,这设计真牛,直接解决无玄关空间少的问题...

    玄关三角形沙发不靠墙,这设计真牛,直接解决无玄关空间少的问题 玄关是现在家居中比较常见的区域,一般情况下,家家户户进门位置都会有一个小玄关,更换鞋帽比较方便.不过有的户型也没有玄关,这种格局在设计的时 ...

  4. 只需两行代码,2080Ti 就能当 V100用,这个炼丹神器真牛!

    作者 | 陈大鑫.青暮 话说人工智能江湖门派众多且繁杂,好似那大脑中的神经网络一般,但繁杂中却仍然有着一统的迹象...... 许久之前,ML派坐落美利坚合众山中,百年来武学奇才辈出,隐然成江湖第一大名 ...

  5. fastjson jar包_经过性能对比,我发现温少的FastJson真牛。

    前语:不要为了读文章而读文章,一定要带着问题来读文章,勤思考.在此,建议大家为本公众号加"星标".如文章写得好,望大家阅读后在右下边"在看"处点个赞,以示鼓励! ...

  6. 去携程实习了!半年时间,从机械转行 Java,二哥的读者真牛逼!

    大家好,我是二哥呀. 今天端午节,我带着老婆.女儿.妹妹来青岛了,高铁上,我们谈起了毕业后去哪里工作的话题.老读者应该知道了,我毕业后去的苏州,从个人情感上来说,我是非常喜欢苏州的,不仅景美,人也美, ...

  7. 真牛逼!我司用了7年的分布式锁方案...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 提到数据一致性.操作原子性,诸如此类的一些与并发有关的词汇时不知道 ...

  8. 印度电工,真牛!上天入海,无所不能...

    点击上方"大鱼机器人",选择"置顶/星标公众号" 福利干货,第一时间送达! 来自:怪奇物语(ID:guaiqiwuyu) 原作者不详,如有版权问题请联系沟通 印 ...

  9. idea 编码扫描插件_用IDEA这样Review代码真牛逼

    一个对项目负责的团队代码质量检查是必不可少的,有条件的团队经常有代码review习惯,这样可以使技术团队共同进步,但是一个庞大的工程做代码review其实是很麻烦的,所以就催生了很多的工具,今天我们就 ...

最新文章

  1. 刘宇凡:数字让切糕与电商溅起涟漪
  2. linux虚拟单用户数,Linux单用户模式
  3. Tableau系列之使用日期
  4. java代码轻量级锁_Java轻量级锁原理详解(Lightweight Locking)
  5. 原生JS封装自己的AJAX
  6. 如果央行加息,以前办的房贷利息也会涨吗?
  7. 操作系统核心原理-5.内存管理(下):段式内存管理
  8. 一年月份大小月口诀_怎么看自己的日柱 公式 推算口诀 最简便计算方法
  9. vscode安装live server
  10. 【Liunx】manjaro 配置vscode python开发环境
  11. java的for循环取出数据只是拿到最后一个_如何保证缓存与数据库双写的一致性...
  12. Java中IDEA,Springboot实现手机获取验证码和倒计时
  13. MATLAB实现SVM多分类(one-vs-rest),利用自带函数fitcsvm
  14. 使用一个运放滤三次谐波 二阶有源带通滤波器的电路设计及波形效果
  15. Texstudio安装后闪退|重装系统Windows10|texstudio2022
  16. 数据导入与预处理实验一---KETTLE数据处理
  17. 如何同时查询多个京东快递单号的物流状态、签收时间
  18. 按键式计算器——人机交互的变革
  19. 【JavaWeb】1—JavaWeb概述
  20. 华为机试-拼音翻译成阿拉伯数字

热门文章

  1. 懂安全攻防的工程师,竟如此吃香!
  2. 如何快速提升新站点的外链数量
  3. 计算机导论——计算机网络05
  4. 主板升级nvme 教程
  5. 低频数字式相位测量仪介绍
  6. 2018 计蒜之道 初赛 第三场
  7. 嵌入式开发之STM32开发之无线控制之PT2262/2272最简单使用-带你实现一个远程控制电灯的例子
  8. 谷歌浏览器手势操作_[经验分享] 2步操作永久提升谷歌Chrome浏览器默认下载速度...
  9. html 状态 304,网站频繁出现304状态码的原因
  10. ie304报错解决方案