HDU 1243 反恐训练营 (动态规划求最长公共子序列)

反恐训练营

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 3040    Accepted Submission(s): 693

Problem Description

当今国际反恐形势很严峻,特别是美国“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

还是求最长公共子序列,但是每次遇到相同的字母后,该加上字母对应的分数

#include<stdio.h>
#include<map>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
int N;
int main(int argc, char *argv[])
{
    vector<vector<int> >c;
    map<int,char>m;
    string s,a,b;
    int score;
    while(~scanf("%d",&N))
    {
        cin>>s;
        for(int i=0;i!=s.size();++i)
        {
            scanf("%d",&score);
            m[s[i]]=score;
        }
        cin>>a;
        cin>>b;
        int x=a.size();
        int y=b.size();
        int SIZE=x>y?x:y;
        SIZE+=1;
        c.resize(SIZE);
        for(int i=0;i<c.size();++i)
        {
            c[i].resize(SIZE);
        }
        for(int i=0;i<x;++i)
            c[i][0]=0;
        for(int j=0;j<y;++j)
            c[0][j]=0;
        for(int i=1;i<=x;++i)
            for(int j=1;j<=y;++j)
            {
                if(a[i-1]==b[j-1])
                {
                    c[i][j]=c[i-1][j-1]+m[a[i-1]];
                }
                else if(c[i][j-1]>=c[i-1][j])
                {
                    c[i][j]=c[i][j-1];
                }
                else
                    c[i][j]=c[i-1][j];
            }
        printf("%d\n",c[x][y]);
    }
    return 0;
}
时间: 2024-08-02 06:55:37

HDU 1243 反恐训练营 (动态规划求最长公共子序列)的相关文章

动态规划求最长公共子序列问题

#include<iostream> #include<string> #include<vector> using namespace std; //找两个子串str1,str2的最长公共子串substr void findLongestSubString(string &str1, string &str2, string &substr){ if (str1.empty() || str2.empty()){ return; } //定义二

HDU 1159 Common Subsequence (动态规划、最长公共子序列)

Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 55301    Accepted Submission(s): 25537 Problem Description A subsequence of a given sequence is the given sequence with some el

!HDU 1243 反恐训练营--dp--(最长公共子序列)

题意:给你一个子弹序列和恐怖分子序列,只有子弹打到对应序号的恐怖分子才能得分,每个恐怖分子有对应的分数,求最大的得分 分析:这题抽象出来的模型就是最长公共子序列,直接套公式:dp[i][j]表示用第i颗子弹打第j个恐怖分子时能得到的最大分数,注意这指的是从开始状态到这一状态这个过程的最优解,而不是这一状态的最优解:状态转移:1.当a[i]==b[j]时,dp[i][j]=dp[i-1][j-1]+v,v是恐怖分子b[j]的分数:2.否则,dp[i][j]=max(dp[i-1][j-1],dp[

九度OJ 1042 Coincidence (动态规划求最长公共子序列)

题目1042:Coincidence 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1689 解决:898 题目描述: Find a longest common subsequence of two strings. 输入: First and second line of each input case contain two strings of lowercase character a-z. There are no spaces before, inside or aft

hdu 1243 反恐训练营

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[2048][2048]; int main() { int i,j,n,s[500],t; char s1[2048],s2[2048],s3[2048]; while(~scanf("%d",&n)) { scanf("%s",s3); for(i=0;i&

【最长公共子序列】hdu 1243 反恐训练营

最长公共子序列: dp[i][j] :当前子弹的最大得分, if ([i-1]==[j-1]) dp[i][j]=dp[i-1][j-1]+score[a[i-1]]; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); 1 #include <cstdio> 2 #include <cstring> 3 4 const int MAXN=2000+5; 5 6 char t[MAXN],a[MAXN],b[MAXN]; 7 int dp[MAXN]

hdoj-1159-Common Subsequence【动态规划求最长公共子序列】

Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 28152 Accepted Submission(s): 12556 Problem Description A subsequence of a given sequence is the given sequence with some element

杭电acm 1243 反恐训练营 LCS

反恐训练营 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6183    Accepted Submission(s): 1592Problem Description 当今国际反恐形势很严峻,特别是美国"9.11事件"以后,国际恐怖势力更是有恃无恐,制造了多起骇人听闻的恐怖事件.基于此,各国都十分担心恐怖势力会对本国社会造成

(hdu step 3.2.2)Common Subsequence(简单dp:求最长公共子序列的长度)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 976 Accepted Submission(s): 538   Probl