zoukankan      html  css  js  c++  java
  • coj 1100 Magic Spell

    这道题的HINT彻底把我弄糊涂了,结果WA5次才发现是求最大子序列而不是连续子串:

    HINT

    子序列的定义:字符串S中从S[ i ]...S[ j ]的长度为K的字符(i<=j),k<=j-i+1。

    # include <stdio.h>
    # include <memory.h>
    
    # define MAX(x, y) ((x)>(y) ? (x):(y))
    
    # define MAXN 1020
    
    int len1, len2;
    char s1[MAXN], s2[MAXN];
    short int f[MAXN][MAXN];
    
    int main()
    {
        int i, j, max;
    
        while (~scanf("%d%s%d%s", &len1, s1+1, &len2, s2+1))
        {
            max = 0;
            memset(f, 0, sizeof(f));
    
            for ( i = 1; i <= len1; ++i)
                for ( j = 1; j <= len2; ++j)
                {
                    if (s1[i] == s2[j]) f[i][j] = f[i-1][j-1]+1;
                    else f[i][j] = MAX(f[i-1][j], f[i][j-1]);
                }
    
            printf("%d\n", f[len1][len2]);
        }
    
        return 0;
    }

    不过也顺便复习了一下最大子串的方法,很相似, 都可以使用滚动数组。

    # include <stdio.h>
    # include <memory.h>
    # include <ctype.h>
    
    # define MAXN 1020
    
    int len1, len2;
    char s1[MAXN], s2[MAXN];
    short int f[MAXN][MAXN];
    
    int main()
    {
        int i, j, max;=
    
        while (~scanf("%d%s%d%s", &len1, s1+1, &len2, s2+1))
        {
            max = 0;
            memset(f, 0, sizeof(f));
    
            for ( i = 1; i <= len1; ++i)
                for ( j = 1; j <= len2; ++j)
                {
                    if (tolower(s1[i]) == tolower(s2[j])) f[i][j] = f[i-1][j-1]+1;
                    if (max < f[i][j]) max = f[i][j];
                }
    
            printf("%d\n", max);
        }
    
        return 0;
    }

     

  • 相关阅读:
    linux安装mysql
    yum命令
    java启动jar包中的指定类
    linux系统配置参数修改
    iconfont阿里巴巴矢量图标库批量保存
    Python 使用Pandas读取Excel的学习笔记
    在Ubuntu18.04的Docker中安装Oracle镜像及简单使用
    Eclipse 安装PyDev开发Python及初步使用
    Python打包工具
    MacOS下打包Python应用
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2446597.html
Copyright © 2011-2022 走看看