1 solutions

  • 0
    @ 2024-5-31 11:27:33

    【算法分析】

    状态表示:f[l][r] 表示l到r构成的回文子序列

    状态计算:

    1.s[l]==s[r]

    2.l不选

    3.r不选

    4.l和r都不选

    【代码实现】

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1010;
    char s[N];
    int f[N][N]; //f[l][r]表示l到r这段构成的最长回文子序列
    
    int main()
    {
        cin>>s;
        int n=strlen(s);
        for(int len=1;len<=n;len++)
        {
            for(int l=0;l+len-1<n;l++)
            {
                int r=l+len-1;
                if(len==1) f[l][r]=1;
                else
                {
                    if(s[l]==s[r]) f[l][r]=f[l+1][r-1]+2; //可以构成回文
                    f[l][r]=max(f[l][r],max(f[l][r-1],f[l+1][r]));
                    //                      不选右边    不选左边
                }
            }
        }
        cout<<n-f[0][n-1];
        return 0;
    }
    
    • 1

    Information

    ID
    1440
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    7
    Tags
    (None)
    # Submissions
    17
    Accepted
    9
    Uploaded By