zoukankan      html  css  js  c++  java
  • Vijos 1111 小胖的水果 LCS

    描述

    xuzhenyi到大同水果店去买水果,但老板huyichen告诉他每次只能买一种,但是xuzhenyi想吃两种,于是在讨价还价之后,huyichen说只要xuzhenyi能把他想要的两种水果合并成一种,就能成功。你能帮他吗?

    格式

    输入格式

    输入文件包含两个要组合的水果名字。所有的名字最多有100个字母。(有若干行)

    输出格式

    对每一组测试数据,打印出一个最短的组合长度.

    样例1

    样例输入1

    apple peach
    ananas banana
    pear peach

    样例输出1

    8
    7
    6

    题解

    这是一道有关“最长公共子序列”的题。由题意不难看出:
    假设两个字符串s和t的长度分别为n和m,则答案即为:
    n+m-{s和t的最长公共子序列的长度}

    代码:

    #include <iostream>
    #include <cstring>
    using namespace std;
    const int maxn = 110;
    int f[maxn][maxn], n, m;
    char s[maxn], t[maxn];
    int main()
    {
        while (cin >> s >> t)
        {
            memset(f, 0, sizeof(f));
            n = strlen(s);
            m = strlen(t);
            f[0][0] = s[0] == t[0];
            for (int i = 1; i < n; i ++)
                f[i][0] = max(f[i-1][0], (int)(s[i] == t[0]));
            for (int i = 1; i < m; i ++)
                f[0][i] = max(f[0][i-1], (int)(s[0] == t[i]));
            for (int i = 1; i < n; i ++)
            {
                for (int j = 1; j < m; j ++)
                {
                    f[i][j] = max(f[i][j-1], f[i-1][j]);
                    if (s[i] == t[j])
                    {
                        f[i][j] = max(f[i][j], f[i-1][j-1]+1);
                    }
                }
            }
            cout << n + m - f[n-1][m-1] << endl;
        }
        return 0;
    }
    
    
  • 相关阅读:
    半主机模式和_MICROLIB 库
    工作中常用的git命令
    Mybatis延迟加载参数配置
    JUnit展示图形化测试结果
    可读、可维护、可扩展,原则、模式与重构
    乐观锁和悲观锁
    HashMap实现原理和底层数据结构?
    视图有啥用?
    单例模式常见有哪几种?
    RPC服务和HTTP服务的区别
  • 原文地址:https://www.cnblogs.com/xianyue/p/7082778.html
Copyright © 2011-2022 走看看