问题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=6739
问题简述:
在 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 表示,便可获得当前法球组合所对应的技能,同时原有的三个法球也不会消失,先后顺序的状态也不会改变。

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

注意:游戏开始的时候,祈求者是没有任何法球的。
问题分析:
刚开始写以为是队列模拟。。写到一半发现是DP
(DP为我薄弱项,只能参考大佬的博客来写了…)
每个技能的排列组合最多有6种,从前一个技能到后一个技能就有36种可能性。
写一个函数来求每一种可能性所需的按键次数即可,再进行暴力DP即可。
核心:dp[i][j]=min(dp[i][j],dp[i-1][k]+gettime(mp[k[i-1]],k,mp[k[i]],j);
总之这题还是需要蛮仔细的写才不会出错。。
(hdu没有要求循环输入使得我心态大蹦)
AC通过的C++语言程序如下:

#include <bits/stdc++.h>#define ull unsigned long long
#define ll long longusing namespace std;const int maxn=100050;//dp[i][j]表示到第i个技能的第j种排列组合所需的最小按键次数
int dp[maxn][6];
map<char,int>mp;//用于映射每个技能//所有技能的所有排列组合
string skill[10][6]={"QQQ","QQQ","QQQ","QQQ","QQQ","QQQ","QQW","QQW","QWQ","QWQ","WQQ","WQQ","QQE","QQE","QEQ","QEQ","EQQ","EQQ","WWW","WWW","WWW","WWW","WWW","WWW","QWW","QWW","WQW","WQW","WWQ","WWQ","WWE","WWE","WEW","WEW","EWW","EWW","EEE","EEE","EEE","EEE","EEE","EEE","QEE","QEE","EQE","EQE","EEQ","EEQ","WEE","WEE","EWE","EWE","EEW","EEW","QWE","QEW","WQE","WEQ","EQW","EWQ"
};//求a技能的第b种排列组合到 c技能的第d种排列组合所需按键次数
int gettimes(int a,int b,int c,int d) {if(skill[a][b]==skill[c][d]) {return 0;}else if(skill[a][b][1]==skill[c][d][0]&&skill[a][b][2]==skill[c][d][1]) {return 1;}else if(skill[a][b][2]==skill[c][d][0]) {return 2;}return 3;
}int main() {ios::sync_with_stdio(false);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;string k;while(cin>>k) {//初始化使dp最大为3 8 12 16...for(int i=0;i<k.length();i++) {for(int j=0;j<6;j++) {if(i==0) dp[i][j]=3;else dp[i][j]=(i+1)*3+i+1;}}//dp 36种排列组合,(首字符不需要计算!)for(int i=1;i<k.length();i++) {for(int j=0;j<6;j++) {for(int g=0;g<6;g++) {dp[i][j]=min(dp[i][j],dp[i-1][g]+gettimes(mp[k[i-1]],g,mp[k[i]],j));}}}int minn=999999999;for(int i=0;i<6;i++) minn=min(minn,dp[k.length()-1][i]);cout<<minn+k.length()<<endl;//加上R的数量}return 0;
}

HDU - 6739 2019CCPC秦皇岛赛区 I. Invoker(DP+思维)相关推荐

  1. 2019CCPC秦皇岛 K MUV LUV UNLIMITED(思维博弈)

    2019CCPC秦皇岛K 这个题感觉就是头脑风暴吧,关键在于抓住正确的方向想下去,我中间也跑偏了几次... 定义一个分支为从叶子往根的方向,不存在包含多个子节点的节点序列,即从叶子到包含多个子节点的节 ...

  2. 2019CCPC秦皇岛赛区 hdu 6740 MUV LUV EXTRA(KMP next数组)

    传送门 MUV LUV EXTRA Time Limit: 2000/1500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Othe ...

  3. 2019CCPC秦皇岛赛区(重现赛)- I

    链接: http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1009&cid=872 题意: 在 dota2 中有一个叫做祈求 ...

  4. 2019ccpc秦皇岛赛区K. MUV LUV UNLIMITED(博弈)

    题目连接 题意:两个人在一棵树上玩游戏,两人轮流在树上选择一个以上的叶子进行删除.最后删掉根节点的人获胜,问是先手必胜还是后手必胜 (1).若只有一条链,则直接判奇偶(废话) (2).若不只一条链,则 ...

  5. HDU多校10 - 6880 Permutation Counting(dp+思维)

    题目链接:点击查看 题目大意:给出一个长度为 n - 1 的 01 序列 b 用来表示排列 a 的相对大小关系,b[ i ] = 0 说明 a[ i ] < a[ i + 1 ] ,b[ i ] ...

  6. MUV LUV EXTRA 2019CCPC秦皇岛站J

    MUV LUV EXTRA 2019CCPC秦皇岛站J (hdu重现赛) 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6740 思路 kmp求循环节 ...

  7. hdu 4799 LIKE vs CANDLE(树形dp)

    题目链接:hdu 4799 LIKE vs CANDLE 解题思路 dp[i][0]表示第i个节点不翻转的最优解,dp[i][1]表示翻转的最优解,每个位置翻转的代价到其父亲节点的位置再计算. 代码 ...

  8. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  9. HDU - 4856 Tunnels (预处理+状压dp)

    HDU - 4856 Tunnels (预处理+状压dp) [hud链接] [vj链接] 题目 Problem Description Bob is travelling in Xi'an. He f ...

最新文章

  1. 使用editcap命令将ERF格式转换为pcap格式
  2. 关于学习Python的一点学习总结(57->正则表达式及re模块中的一些函数)
  3. Asp.net PageBase学习总结
  4. java面试常见问题
  5. bitnamigitlab_100%可用不坑爹的BitNami GitLab安装教程
  6. java 修饰符作用_Java关键字修饰符的作用范围
  7. 对HTTP/2 支持
  8. html地区三级联下拉列表,JS-三级联下拉列表
  9. r语言dataellipse_r – 在ggplot2中微调stat_ellipse()
  10. RabbitMQ 最新版本 下载、部署 _rpm版本(CentOS7环境)
  11. 专升本c语言名词解释题_专升本到底难不难?
  12. 利用makefile构建c++项目的思路介绍
  13. 两个苹果手机共享步数_最新刷步教程 | 蚂蚁森林如何快速刷步数,获得296g能量...
  14. 饿了么自动登录解决方案(手机短信登录)
  15. 《天才在左疯子在右》读书摘记
  16. Android 模拟器 连接局域网
  17. An exception occurred while acquiring a poolable resource. Will retry.
  18. 应届毕业生外包公司体验
  19. 医学影像中的基础知识
  20. uniapp微信小程序老预览失败,或者上传失败(已解决)

热门文章

  1. python爬取股票平均成本怎么算_Python-多个股票的投资组合分析,对,进行
  2. 【天池龙珠计划】Python训练营 Task04 Python数据分析:从0完成一个数据分析实战
  3. adb命令——adb shell top命令
  4. 普通高等学校毕业生登记表 计算机水平,普通高等学校毕业生登记表模板-20210629233444.pdf-原创力文档...
  5. Linux部署网盘(nextcloud)
  6. android webview全屏显示html内容
  7. 模拟手机通讯录联系人功能
  8. Unity获取物体下的子物体
  9. 实现输入10个数,输出这10个数的和,平均值;输出该组数中数与数的最大差值;再输入一个数,然后确定它在这个数组中第一次出现的位置,如果没有该数则输出-1,否则输出其下标
  10. 我所认为的高级软件工程师