外星人的密码数字

来源:互联网 发布:python宝典 pdf 编辑:程序博客网 时间:2024/06/10 09:43

【题目描述】
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.

测试数据下载

3 0
原创粉丝点击