cv2980(LCS)

题目链接

分析:
求字符串的最长回文串就是将字符串取反然后求两个串的最长公共子序列
还记得这道题
然而cv上的这道题并没有说明元素互异
我们就不能保证转换出一个n级别的字符串
所以干脆朴素算法

tip

对称系数k是指最长对称子序列的长度,非最长对称子串的长度

字符串的数组要开到1000

自己在下面拍,没有任何错误
交上去真的就是一直WA
找不到任何错误
这里写图片描述
扔一个学姐的标程吧

这里写代码片
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

char s[101][510],s1[5100],s2[5100];
int f[510][510],n;
struct node{
    int bh,k,l;
};
node str[501];

int cmp(const node &a,const node &b)
{
    if (a.k>b.k) return 1;
    else if (a.k<b.k) return 0;
    else 
    {
        int i=0;
        while (s[a.bh][i]==s[b.bh][i]&&i<a.l-1&&i<b.l-1) i++;
        if (s[a.bh][i]<s[b.bh][i]) return 1;
        else if (s[a.bh][i]>s[b.bh][i]) return 0;
        if (a.l<b.l) return 1;
        else return 0;
    }
}

void doit(int bh)
{
    int i,j,k,ans=0,l,s;
    memset(f,0,sizeof(f));
    int len=strlen(s1);
    for (i=0;i<len;i++) s2[i]=s1[len-i-1];
    for (i=0;i<len;i++)
        for (j=0;j<len;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]);
        }
    str[bh].k=f[len-1][len-1];
}

int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%s",&s[i]),str[i].bh=i,str[i].l=strlen(s[i]);
    for (int i=1;i<=n;i++)
    {
        memset(s1,'',sizeof(s1));
        strcpy(s1,s[i]);
        doit(i);
    }
    sort(str+1,str+1+n,cmp);
    for (int i=1;i<=n;i++)
        printf("%s
",s[str[i].bh]);
    return 0;
}
原文地址:https://www.cnblogs.com/wutongtong3117/p/7673178.html