博客
关于我
反恐训练营
阅读量:200 次
发布时间:2019-02-28

本文共 2394 字,大约阅读时间需要 7 分钟。

当今国际反恐形势很严峻,特别是美国“9.11事件”以后,国际恐怖势力更是有恃无恐,制造了多起骇人听闻的恐怖事件。基于此,各国都十分担心恐怖势力会对本国社会造成的不稳定,于是纷纷在本国的军队、警察队伍中开展了反恐训练。作为反恐立场坚定的大国,中国也十分重视在人民解放军、武装警察部队、人民警察队伍中反恐训练,还专门成立了反恐特警队。

炜炜是反恐特警队的一名新队员,现在正在接受培训。这几天刚好是射击训练第二阶段——实弹应变训练的日子,此前的第一阶段里,炜炜经过努力,已经将自己训练成为一个百发百中的神抢手了!这次,他将背着国产最新型12.7mm重型狙击枪进行训练比赛。
这次训练比赛的规则是这样的:
1、每个队员从出发点开始,沿着一条唯一的笔直道路跑直到终点,途中不允许往回跑,否则将被取消比赛资格。
2、出发前,每个队员的枪膛内都被装了顺序一样的、用小写英文字母标明类型的子弹序列,每位队员被告知这一序列的信息;同时,每位队员也被告知恐怖分子即将出现的序列和类型(同样用小写英文字母标明类型)。
3、在跑动的过程中,若发现“恐怖分子”,特警队员可以选择用枪击毙他,来得到写在“恐怖分子”胸前的得分,但是前提是他使用的子弹类型必须和“恐怖分子”类型相同,否则,即使击毙了“恐怖分子”,也得不到分数;当然选择不击毙他也是可以的,这样他不会从那个“恐怖分子”身上得到分数。
4、允许特警队员放空枪,这样可以消耗掉型号不对的子弹而不至于杀死“恐怖分子”(当然每个特警队员都不会愚蠢到不装消音装置就放空枪,以至于吓跑“恐怖分子”),等待枪口出现正确型号的子弹击毙他得分。
这里,我们假定:
1、对于每个队员,途中出现恐怖分子的地点、时间、类型也是完全一样的。
2、每颗子弹都是质量合格的,都可以发挥杀伤效力
3、由于队员各个都是神枪手,一旦他选择了正确的子弹,向目标射击,目标100%被爆头
4、每个队员的记忆力超强,能记住所有子弹序列信息和恐怖分子序列信息。
5、每个队员体力足够好,能跑完全程,并做他想要做的
6、“恐怖分子”是不动的,小范围内不存在多于一个的恐怖分子;
炜炜需要你的帮助,告诉他如何做,才能得到最高的分数。现在如果告诉你出发时枪膛内子弹的序号和型号、恐怖分子出现的序号和类型,你能告诉炜炜他最多能得到多少分数吗?

Input

输入数据的第一行有一个整数N表示子弹和恐怖分子的类型数。随后的一行是各种恐怖分子类型的一行字母,两个字母之间没有任何字符。接下来的一行是击毙上一行对应位置恐怖分子类型的得分数,每个分数之间恰有一个空格。第三第四行分别表示开始时枪膛内子弹的序列(左边的先打出)和恐怖分子出现的序列(左边的先出现),字母之间都没有任何字符。

每个测试数据之间没有空格和空行。你的程序必须通过全部测试数据,才能被判为AC。

Output

对于每一个测试数据,输出炜炜最多能得到的分数。

Sample Input

3
abc
1 1 1
abc
ccc
3
abc
1 1 1
ccc
aba
Sample Output
1
0

题目分析:

这道题是最长公共子序列的一个变型题目。这道题可以看成是给你两个序列,(子弹顺序和恐怖分子出现顺序)不同的字母匹配成功会给不同分数,求怎样匹配才能获得最大分数的题。

  1. 状态表示:f[i][j] //表示第一个序列的前i个字母和第二个序列的前j个字母匹配获得的最大分数
  2. 状态计算:这道题可以划分出四种状态
    1)公共序列不包含第i和第j个元素,此时f[i][j]=f[i-1][j-1],但是这种状态是被包含在其余的几种情况中的,因此在状态转移方程中可以不包含这个状态
    2)公共序列包含第i个元素,但不包含第j个元素,此时f[i][j]=f[i][j-1]
    3)公共序列包含第j个元素,但不包含第i个元素,此时f[i][j]=f[i-1][j]
    4)公共序列既包含i又包含j(这个状态成立的约束条件为a[i]==b[j]),此时f[i][j]=f[i-1][j-1]+score[a[i]](f[i-1][j-1]加上当第i个字母匹配成功时加的分数)

代码如下:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long longconst int N=5e3+5;using namespace std;char a[N],s[N];int f[N][N];unordered_map
score;//用映射来存每种字母匹配成功时加到分数int main(){ int n; while(cin>>n) //该题有多组输入 { for(int i=1;i<=n;i++) //记录每种字母对应的分数 cin>>a[i]; for(int i=1;i<=n;i++) { int x; cin>>x; score[a[i]]=x; } cin>>a+1; //输入要匹配的两字符串 cin>>s+1; int lena=strlen(a+1); //计算长度 int lens=strlen(s+1); for(int i=1;i<=lena;i++) for(int j=1;j<=lens;j++) { //f[i][j-1]和f[i-1][j]两种情况是无条件的 f[i][j]=max(f[i-1][j],f[i][j-1]); if(a[i]==s[j]) f[i][j]=max(f[i][j],f[i-1][j-1]+score[a[i]]); } cout<
<

转载地址:http://hptn.baihongyu.com/

你可能感兴趣的文章
MYSQL:int类型升级到bigint,对PHP开发语言影响
查看>>
Mysql:mysql 5.X 报错 ERROR 1193 (HY000): Unknown system variable ‘validate_password_length‘
查看>>
MySQL:MySQL执行一条SQL查询语句的执行过程
查看>>
Mysql:SQL性能分析
查看>>
mysql:SQL按时间查询方法总结
查看>>
MySQL:什么样的字段适合加索引?什么样的字段不适合加索引
查看>>
MySQL:判断逗号分隔的字符串中是否包含某个字符串
查看>>
MySQL:某个ip连接mysql失败次数过多,导致ip锁定
查看>>
MySQL:索引失效场景总结
查看>>
Mysql:避免重复的插入数据方法汇总
查看>>
MyS中的IF
查看>>
M_Map工具箱简介及地理图形绘制
查看>>
m_Orchestrate learning system---二十二、html代码如何变的容易
查看>>
M×N 形状 numpy.ndarray 的滑动窗口
查看>>
m个苹果放入n个盘子问题
查看>>
n = 3 , while n , continue
查看>>
n 叉树后序遍历转换为链表问题的深入探讨
查看>>
N!
查看>>
N-Gram的基本原理
查看>>
n1 c语言程序,全国青少年软件编程等级考试C语言经典程序题10道七
查看>>