P1024 外星人的密码数字

描述 Description
    XXXX年突然有外星人造访,但大家语言不通,不过科学家们经过研究发现外星人用26个英文字母组成的单词中最长不降子序列的长度来表述数字,且英文字母的排列顺序不同,现给出其排列顺序,再给出外星人说的每个数字(其实是每个英文单词,用空格隔开),翻译出外星人所说的数字(连续输出,最后加回车)。
 (因为是最长不降子序列,所以数字中没有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*/
19int Pan(char x,char y);
20char str[30];
21int 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 
48int 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}

 

 

 

 

转载于:https://www.cnblogs.com/songacm/p/3325207.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值