NOIP 提高组初赛 · NOIP 2016 提高组初赛试题 第 25 题

选择题 · 答案 5 · 考点:输入输出、位运算、分支结构、字符串(string)

← 整套速查表 NOIP 提高组初赛 全部真题

题目

#include <iostream>
using namespace std;
int lps(string seq, int i, int j)
{
    int len1, len2;
    if (i == j)
        return 1;
    if (i > j)
        return 0;
    if (seq[i] == seq[j])
        return lps(seq, i + 1, j - 1) + 2;
    len1 = lps(seq, i, j - 1);
    len2 = lps(seq, i + 1, j);
    if (len1 > len2)
        return len1;
    return len2;
}
int main()
{
    string seq = "acmerandacm";
    int n = seq.size();
    cout << lps(seq, 0, n - 1) << endl;
    return 0;
}

输出:_________

答案:5

考点

输入输出位运算 讲解 →位运算 真题汇总 →分支结构字符串(string)

解题思维

看到 lps 递归定义 → 先想最长回文子序列(可删字符),不是子串

常见错误

易混:lps 是子序列(可删),不是子串(必须连续)

详细解析(节选)

考点:最长回文子序列(LPS)

程序在做什么

输入字符串,递归求最长回文子序列长度:两端字符相等时 +2 向内递归,否则取删左或删右的较大值。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断