首页 > 技术文章 > 外星人的密码数字

JRX2015U43 2016-09-29 13:20 原文

【题目描述】
XXXX年突然有外星人造访,但大家语言不通,不过科学家们经过研究发现外星人用26个英文字母组成的单词中最长不降子序列的长度来表述数字,且英文字母的排列顺序不同,现给出其排列顺序,再给出外星人说的每个数字(其实是每个英文单词,用空格隔开),翻译出外星人所说的数字(连续输出,最后加回车)。因为是最长不降子序列,所以数字中没有0,也就是说外星人的数字是>=1的数字。
【输入格式】
第一行一个含有26个小写字母的字符串,保证不重复
第二行一个长度<=255的字符串表示英文单词,用空格隔开
【输出格式】
外星人所说的数字
【样例输入】
abcdefghijklmnopqrstuvwxyz
abcd efg hhh ihg
【样例输出】
4331
【样例解释】
由第一个字符串得a=1,b=2,c=3,d=4,…,z=26
单词abcd即1234,最长不下降子序列长度为4
单词efg即567,最长不下降子序列长度为3
单词hhh即888,最长不下降子序列长度为3
单词ihg即987,最长不下降子序列长度为1
【分析】
动态规划+字符串处理,可以轻松过掉。

var
  a:array[1..1000]of longint;
  lis:array[1..1000]of longint;
  number:array['a'..'z']of longint;
  i,j,n,ans:longint;
  st,ss:string;
begin
  readln(st);
  for i:=1 to 26 do number[st[i]]:=i;
  readln(st);
  st:=st+' ';
  repeat
    ss:=copy(st,1,pos(' ',st));
    delete(st,1,pos(' ',st));
    n:=length(ss);
    for i:=1 to n do a[i]:=number[ss[i]];
    for i:=1 to n do lis[i]:=1;
    for i:=2 to n do
      for j:=1 to i-1 do
        if (a[j]<=a[i])and(lis[j]+1>lis[i]) then lis[i]:=lis[j]+1;
    ans:=0;
    for i:=1 to n do
      if ans<lis[i] then ans:=lis[i];
    write(ans);
  until length(st)<=0;
end.

测试数据下载

推荐阅读