描述 Description
XXXX年突然有外星人造访,但大家语言不通,不过科学家们经过研究发现外星人用26个英文字母组成的单词中最长不降子序列的长度来表述数字,且英文字母的排列顺序不同,现给出其排列顺序,再给出外星人说的每个数字(其实是每个英文单词,用空格隔开),翻译出外星人所说的数字(连续输出,最后加回车)。
(因为是最长不降子序列,所以数字中没有0,也就是说外星人的数字是>=1的数字)
例如
我们正常的字母排列顺序是abcdefg…….xyz,代表a<b<c<…..<x<y<z
abcd efg hhh ihg四个字符串的最长不降子序列的长度分别为4 3 3 1
(因为是最长不降子序列,所以数字中没有0,也就是说外星人的数字是>=1的数字)
例如
我们正常的字母排列顺序是abcdefg…….xyz,代表a<b<c<…..<x<y<z
abcd efg hhh ihg四个字符串的最长不降子序列的长度分别为4 3 3 1
输入格式 InputFormat
第1,2行为字符串
含义如题描述
含义如题描述
输出格式 OutputFormat
输出答案
含义如题描述
含义如题描述
代码:
01 | #include <stdio.h> |
02 | #include <string.h> |
03 | /* |
04 | 求解最长不降子序列的dp: |
05 | 从后往前逆推: |
06 | 对于n个数,我们可以分为n-1个阶段。 |
07 | 我们由后向前搜索(逆推法),我们可以这样思考: |
08 | 1· 对a(n)来说,由于它是最后一个数,所以当从a(n)开始查找时,只存在长度为1的不下降序列; |
09 | 2· 若从a(n-1)开始查找,则存在下面的两种可能性: |
10 | ①若a(n-1)<a(n)则存在长度为2的不下降序列a(n-1),a(n)。 |
11 | ②若a(n-1)>a(n)则存在长度为1的不下降序列a(n-1)或a(n)。 |
12 | 3· 一般若从a(i)开始,此时最长不下降序列应该按下列方法求出: |
13 | 在a(i+1),a(i+2),…,a(n)中,找出一个比a(i)大的且最长的不下降序列,作为它的继。 |
14 | 4.用数组f(i)点i到n的最长的不降子序列的长度. |
15 | */ |
16 | /* |
17 | 第二个要写一个判断是否不降的函数。 |
18 | */ |
19 | int Pan( char x, char y); |
20 | char str[30]; |
21 | int main() |
22 | { |
23 | int ff[300]; |
24 | char f[300]; |
25 | int i,j,k; |
26 | scanf ( "%s" ,str); |
27 | while ( scanf ( "%s" ,f)!=EOF) |
28 | { |
29 | int n,t,max; |
30 | int len= strlen (f); |
31 | ff[len-1]=1;max=1; |
32 | for (i=len-2;i>=0;i--) |
33 | { |
34 | max=0; |
35 | for (j=i+1;j<len;j++) |
36 | if (Pan(f[i],f[j])) |
37 | if (ff[j]>max) max=ff[j]; |
38 | ff[i]=max+1; |
39 | } |
40 | for (i=0;i<len;i++) //这里的len写成了26,就贡献了两个WA... |
41 | if (ff[i]>max) max=ff[i]; |
42 | printf ( "%d" ,max); |
43 | } |
44 | printf ( "\n" ); |
45 | return 0; |
46 | } |
47 |
48 | int Pan( char x, char y) |
49 | { |
50 | //如果x<=y,返回true,否则返回false; |
51 | int a,b; |
52 | for ( int i=0;i<26;i++) |
53 | if (str[i]==x) {a=i; break ;} |
54 | for ( int i=0;i<26;i++) |
55 | if (str[i]==y) {b=i; break ;} |
56 | if (a<=b) return 1; |
57 | else return 0; |
58 | } |