传送门

Problem Description
在 dota2 中有一个叫做祈求者(Invoker)的英雄,在游戏中他有三个基础技能:冰(Quas),雷(Wex),火(Exort),每施展一个技能就可以获得相应属性的一个法球(element)。

但是祈求者同时最多只能有三个法球,即如果他在有三个法球的状态下又使用了某个法球技能,那么他会获得该法球,并失去之前三个法球中最先获得的一个。

不难得出,祈求者身上的三个法球的无顺序组合有 10 种,每一种都对应着一个组合技能:

  1. 急速冷却(Cold Snap),无序组合 QQQ,用 Y 表示
  2. 幽灵漫步(Ghost Walk),无序组合 QQW,用 V 表示
  3. 寒冰之墙(Ice Wall),无序组合 QQE,用 G 表示
  4. 电磁脉冲(EMP),无序组合 WWW,用 C 表示
  5. 强袭飓风(Tornado),无序组合 QWW,用 X 表示
  6. 灵动迅捷(Alacrity),无序组合 WWE,用 Z 表示
  7. 阳炎冲击(Sun Strike),无序组合 EEE,用 T 表示
  8. 熔炉精灵(Forge Spirit),无序组合 QEE,用 F 表示
  9. 混沌陨石(Chaos Meteor),无序组合 WEE,用 D 表示
  10. 超震声波(Deafening Blast),无序组合 QWE,用 B 表示

当祈求者拥有三个法球的时候,使用元素祈唤(Invoke)技能,用 R 表示,便可获得当前法球组合所对应的技能,同时原有的三个法球也不会消失,先后顺序的状态也不会改变。

现在给定一个技能序列,你想按照给定的顺序将他们一个一个地祈唤出来,同时你想用最少的按键来达到目标,所以你想知道对于给定的一个技能序列,最少按多少次键才能把他们都祈唤出来。

注意:游戏开始的时候,祈求者是没有任何法球的。

Input
仅一行一个字符串 s,表示技能序列。其中所有字母都是大写,且在 {B,C,D,F,G,T,V,X,Y,Z} 内。

1≤|s|≤105

Output
仅一行一个正整数,表示最少按键次数。

Sample Input
XDTBV

Sample Output
14

思路:递推,首先,基础按键数是字符串的长度,即每个技能都需要按 ‘R’ 释放。其次,每个技能,最多有六种组合方式。dp[i][j]表示在第i个技能选第j种组合方式的情况下,前i个技能所需最少按键数。 对于每个i,暴力枚举上一个技能和当前技能的所有可能的组合方式,他们上一个的后缀和当前的前缀重合的越多,所需按键数越少,分别计算得出第i个技能在六种组合方式下的最少按键数,最后枚举取最少的即可。

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
#define inf 0x3f3f3f3f
const int N = 1e5+10;
int dp[N][10];
char a[15][6][4]=
{{"QQQ","QQQ","QQQ","QQQ","QQQ","QQQ"},  //为了枚举方便,不满6个的补满即可{"QQW","QWQ","WQQ","QQW","QQW","QQW"},{"QQE","QEQ","EQQ","QQE","QQE","QQE"},{"WWW","WWW","WWW","WWW","WWW","WWW"},{"QWW","WQW","WWQ","QWW","QWW","QWW"},{"WWE","WEW","EWW","WWE","WWE","WWE"},{"EEE","EEE","EEE","EEE","EEE","EEE"},{"QEE","EQE","EEQ","QEE","QEE","QEE"},{"WEE","EWE","EEW","WEE","WEE","WEE"},{"QWE","QEW","EQW","EWQ","WQE","WEQ"}
};
int cal(string s1,string s2)
{if(s1==s2) return 0;if(s1[1]==s2[0]&&s1[2]==s2[1]) return 1;if(s1[2]==s2[0]) return 2;return 3;
}
int main()
{cin.tie(0);ios::sync_with_stdio(false);string s;map<char,int> mp;mp['Y']=0;mp['V']=1;mp['G']=2;mp['C']=3;mp['X']=4;mp['Z']=5;mp['T']=6;mp['F']=7;mp['D']=8;mp['B']=9;mp['.']=10;while(cin>>s){int n=s.size();s=" "+s;int ans=n;memset(dp,inf,sizeof dp);for(int i=0;i<6;i++)dp[1][i]=3;for(int i=2;i<=n;i++)for(int j=0;j<6;j++)for(int k=0;k<6;k++)dp[i][j]=min(dp[i][j],dp[i-1][k]+cal(a[mp[s[i-1]]][k],a[mp[s[i]]][j]));int x=inf;for(int i=0;i<6;i++)x=min(x,dp[n][i]);cout<<ans+x<<endl;}return 0;
}

2019ccpc秦皇岛 Invoker(dp / 递推)相关推荐

  1. Two Arrays(DP递推)

    You are given two integers nn and mm. Calculate the number of pairs of arrays (a,b)(a,b) such that: ...

  2. HDU 4489 (DP递推计数)

    DP 递推计数 题意: 这是一道比较神奇的题,很考验思维:有n个高低不同的人,现在需要进行排列,排列一定要满足两种方式 高低高··· 低高低··· 求出有多少排列方式. 思路: 我们的切入点是第i个人 ...

  3. 动态规划入门之dp递推~

    欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/--萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗-- 本篇文章重在递推,不 ...

  4. hdu 1723 DP/递推

    题意:有一队人(人数 ≥ 1),开头一个人要将消息传到末尾一个人那里,规定每次最多可以向后传n个人,问共有多少种传达方式. 这道题我刚拿到手没有想过 DP ,我觉得这样传消息其实很像 Fibonacc ...

  5. POj 3420 Quad Tiling 状态压缩DP+递推+矩阵快速幂

    哈哈,写了好久的,总算对了. 接下来介绍两种思路: 先介绍一种   递推+矩阵的快速幂的方法 一种DP的思想考虑4×n的最后一列  ,可以放的方法一共有5种 1.放4个 1×2  则 为dp[n-2] ...

  6. BZOJ 3329: Xorequ(数位dp+递推)

    传送门 解题思路 可以把原式移项得\(x\)^\(2x\)=\(3x\),而\(x+2x=3x\),说明\(x\)二进制下不能有两个连续的\(1\).那么第一问就是一个简单的数位\(dp\),第二问考 ...

  7. Power oj2498/DP/递推

    power oj 2498 /递推 2498: 新年礼物 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submit: 12 Accepted: 3 ...

  8. HDU-5965 扫雷(dp / 递推)

    传送门 扫雷游戏是晨晨和小璐特别喜欢的智力游戏,她俩最近沉迷其中无法自拔. 该游戏的界面是一个矩阵,矩阵中有些格子中有一个地雷,其余格子中没有地雷. 游戏中,格子可能处于己知和未知的状态.如果一个己知 ...

  9. 2019.08.20【NOIP提高组】模拟 B 组 排序、DP+递推、矩阵乘法+数位DP/类欧

    文章目录 0 旅游(travel) 1 做梦(dream) 2 数数(count) 初见时,她说,"我无力自保,无处可去,无人可依." 多年后,他说,"我教你射箭,你已有 ...

最新文章

  1. utf8 txt文本转ansi vbs_数据分析之路-文本分析
  2. 使用python 的paramiko制作堡垒机
  3. Android UI selector 例子 (drawable/color)
  4. 使用LightBDD轻松实现行为驱动开发
  5. 跟我一起学.NetCore之.NetCore概述
  6. Vue组件学习之组件自定义事件
  7. linux使用---automake学习(从原理到实践,一步步完成automake)
  8. python的常用标准库
  9. 机器学习之K均值聚类算法K-Means(python代码实现)
  10. 数商云跨境电商供应链平台方案,提供全链条的跨境供应链服务
  11. mysql got signal 6_[ERROR] mysqld got signal 6 错误
  12. 字符串函数的使用及模拟实现:strcpy、strcmp、strcat、strstr
  13. ps裁剪和裁切的区别_PS剪切、裁剪、裁切的区别
  14. 对项目采购管理的分析----合同类型及例题
  15. 2021年数学建模国赛湖北赛区推荐国奖名单
  16. POJ 1915(双向广搜)
  17. 上海配眼镜的闭坑分享,配30副眼镜的资深眼镜控聊聊心得
  18. Learning English From Android Source Code:1
  19. 前端笔记5 JQuery 语法及应用
  20. 正大国际:期货交易为什么小止损大止盈还是无法获利呢?

热门文章

  1. java 中boolean与Boolean的区别
  2. 从理解开始 谈谈px rem 和 em 的区别与联系
  3. 虹科分享|终端安全防护|网络安全术语列表(二)
  4. echarts全国地图只显示南海诸岛问题
  5. SAP一共有多少模块?
  6. cocos2dx android 实现应用重启
  7. (转)PC机使用网络调试助手获取onenet的数据(https://blog.csdn.net/qq_29219435/article/details/78480872)
  8. 服装行业进销存软件哪个好?
  9. java list stream avg_使用jdk8的Stream来获取list集合的最小值、最大值、总和、平均数...
  10. Weex 的采坑指南