B - 反恐训练营

总结

当今国际反恐形势很严峻,特别是美国“9.11事件”以后,国际恐怖势力更是有恃无恐,制造了多起骇人听闻的恐怖事件。基于此,各国都十分担心恐怖势力会对本国社会造成的不稳定,于是纷纷在本国的军队、警察队伍中开展了反恐训练。作为反恐立场坚定的大国,中国也十分重视在人民解放军、武装警察部队、人民警察队伍中反恐训练,还专门成立了反恐特警队。
炜炜是反恐特警队的一名新队员,现在正在接受培训。这几天刚好是射击训练第二阶段——实弹应变训练的日子,此前的第一阶段里,炜炜经过努力,已经将自己训练成为一个百发百中的神抢手了!这次,他将背着国产最新型12.7mm重型狙击枪进行训练比赛。这次训练比赛的规则是这样的:1、每个队员从出发点开始,沿着一条唯一的笔直道路跑直到终点,途中不允许往回跑,否则将被取消比赛资格。2、出发前,每个队员的枪膛内都被装了顺序一样的、用小写英文字母标明类型的子弹序列,每位队员被告知这一序列的信息;同时,每位队员也被告知恐怖分子即将出现的序列和类型(同样用小写英文字母标明类型)。3、在跑动的过程中,若发现“恐怖分子”,特警队员可以选择用枪击毙他,来得到写在“恐怖分子”胸前的得分,但是前提是他使用的子弹类型必须和“恐怖分子”类型相同,否则,即使击毙了“恐怖分子”,也得不到分数;当然选择不击毙他也是可以的,这样他不会从那个“恐怖分子”身上得到分数。4、允许特警队员放空枪,这样可以消耗掉型号不对的子弹而不至于杀死“恐怖分子”(当然每个特警队员都不会愚蠢到不装消音装置就放空枪,以至于吓跑“恐怖分子”),等待枪口出现正确型号的子弹击毙他得分。这里,我们假定:1、对于每个队员,途中出现恐怖分子的地点、时间、类型也是完全一样的。2、每颗子弹都是质量合格的,都可以发挥杀伤效力3、由于队员各个都是神枪手,一旦他选择了正确的子弹,向目标射击,目标100%被爆头4、每个队员的记忆力超强,能记住所有子弹序列信息和恐怖分子序列信息。5、每个队员体力足够好,能跑完全程,并做他想要做的6、“恐怖分子”是不动的,小范围内不存在多于一个的恐怖分子;炜炜需要你的帮助,告诉他如何做,才能得到最高的分数。现在如果告诉你出发时枪膛内子弹的序号和型号、恐怖分子出现的序号和类型,你能告诉炜炜他最多能得到多少分数吗?
Input
输入数据的第一行有一个整数N表示子弹和恐怖分子的类型数。随后的一行是各种恐怖分子类型的一行字母,两个字母之间没有任何字符。接下来的一行是击毙上一行对应位置恐怖分子类型的得分数,每个分数之间恰有一个空格。第三第四行分别表示开始时枪膛内子弹的序列(左边的先打出)和恐怖分子出现的序列(左边的先出现),字母之间都没有任何字符。每个测试数据之间没有空格和空行。你的程序必须通过全部测试数据,才能被判为AC。
Output
对于每一个测试数据,输出炜炜最多能得到的分数。
Sample Input
3abc
1 1 1
abc
ccc
3
abc
1 1 1
ccc
aba
1.自己的做题周折
这道题自己开始写,寻思了半天总有捯饬出一个状态转移方程,我开始用的结构体把恐怖分子类型和对应击杀分数绑定,然后通过后来的循环挨个对应恐怖分子的分数,说实话,状态转移方程就没写对,又弄了那么多循环记录恐怖分子击杀分数,第一遍是超时。看到超时,我本以为是状态转移方程是对的,只是过程循环次数多,才超时。后来,去网上看了题解才知道原来状态转移方程方程就不对。题解上说是最大公共子序列的变式,我才知道噢,原来自己差的不是一点半点。其实,开始看这道题的时候就感觉很熟悉,但是最后还是弄错了题意,需要反思做过的题,说明还是没有深层次掌握根本。
2.代码注意细节
1.开始的结构体很不必要,弄上可能在后来检索对应分数时出现多重循环,超时。
可以直接用数组下标嵌套的方式,标记不同类型的恐怖分子对应的分数。
2.dp[i-1][j-1]表示到第i个子弹第j个恐怖分子最多可以得到的分数。(注意下标元素,字符数组是从0开始,数字数组是从1开始)
状态转移方程
当a[i-1]=b[j-1]时,
dp[i][j]=dp[i-1][j-1]+scorea[i-1]-‘a’
否则
dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
这里跟最长公共子序列完全相同。
3.代码展示

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int dp[2005][2005];
int max(int r, int m){
	if(r>m)
	return r;
	else
	return m;
	}
int main(){
	char a[2005],b[2005],y[2005];
	int n, score[205];
	while(scanf("%d", &n)!=EOF){
		scanf("%s", y);
		for(int i=0;i<n;i++){
			int k;
			scanf("%d", &k);
			score[y[i]-'a']=k;
			}
			
		scanf("%s%s",a,b);
		int len1=strlen(a);
		int len2=strlen(b);
		
		memset(dp, 0,sizeof(dp));
		for(int i=1;i<=len1;i++){	
	    for(int j=1;j<=len2;j++){
			if(a[i-1]==b[j-1])
				dp[i][j]=dp[i-1][j-1]+score[a[i-1]-'a'];
				
			else
				dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
				
				}
				}
			printf("%d\n",dp[len1][len2]);
			}
			}	

继续努力,实在不行,就一个一个看题解,反正看多了一定有收获,加油!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我们可以了解到精英是一种以团队合作为主的第一人称射击游戏,简称CS。同时,我们还可以看到一个模拟实现战士开枪射击敌人的场景的代码范例,以及一个输出警察和土匪的武器情况的代码范例。 如果您想了解更多关于Python精英的内容,可以参考以下链接: https://github.com/ValveSoftware/csgo-demoinfo-python https://github.com/ValvePython/csgo/blob/master/csgo/protobufs/cstrike15_usermessages.proto 如果您想了解如何使用Python实现类似的游戏场景,可以参考以下步骤: 1. 定义一个玩家类,包括属性:姓名、血量、武器等。 2. 定义一个枪类,包括属性:型号、杀伤力、剩余子弹等。 3. 实现玩家开枪方法,方法流程如下: 1) 判断玩家是否有武器,如果没有,提示玩家没有武器。 2) 判断玩家武器是否有子弹,如果没有,提示玩家需要装弹。 3) 如果有武器且有子弹,用枪的杀伤力修改敌人的血量。 4. 实现玩家装弹方法,方法流程如下: 1) 判断玩家是否有武器,如果没有,提示玩家没有武器。 2) 判断玩家武***得到需要装弹的数量。 4) 如果需要装弹的数量大于剩余子弹数,提示玩家剩余子弹不足。 5) 如果剩余子弹数足够,将武器的当前子弹数加上需要装弹的数量。 5. 实现玩家受伤方法,方法流程如下: 1) 玩家血量减去枪对象的杀伤力。 2) 判断修改后的玩家血量是否小于等于0,如果是,提示玩家挂了。 3) 如果玩家还有血量,提示玩家受伤以及当前血量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值