[codevs2980] 모자 사기 동태 기획

제목 설명Description
   A       ,    n    (1<=n<=100),           ,       len (1<=len<=500)。                            。       ,           k (           )          A       。

    ,    character (k=5)   pollution (k=4)    ,apple (k=2)   pear (k=1)    。

      n    ,                  (k         )。

설명 입력 Input Description
입력 데이터의 첫 번째 줄은 문자열이 있음을 나타내는 n 줄만 있습니다.
다음은 n줄이 있고 줄마다 문자열이 있습니다.
출력 설명 Output Description
출력에는 n줄이 있고 줄마다 문자열이 있으며 대칭 계수에 따라 크고 작은 순서로 정렬된 문자열을 표시하며 대칭 계수와 동시에 사전 순서대로 정렬됩니다.
샘플 Sample Input 입력
5
pineapple
banana
peach
coconut
character
샘플 출력 Sample Output
banana
character
pineapple
coconut
peach
데이터 범위 및 프롬프트 Data Size & Hint
데이터 범위:
1<=n<=100
1<=len<=500
1<=k<=len
팁:
대칭 계수 k는 가장 긴 대칭 서열의 길이를 가리키며 가장 긴 대칭 서열의 길이가 아니다.
문자열의 가장 긴 대칭 서열은 문자열과 반열되는 가장 긴 공공 서열이며, 문자열마다 폭력적으로 계산하면 된다.
코드:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int dp[2333][2333];
struct str{
    string s;
    int len;
}l[2333];

bool cmp(str a,str b)
{
    if(a.len!=b.len) return a.len>b.len;
    return a.s<b.s;
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int k=1;k<=n;k++)
    {
        cin>>l[k].s;
        string ss;
        memset(dp,0,sizeof(dp));
        int len=l[k].s.length();
        for(int i=len-1;i>=0;i--) ss+=l[k].s[i];
        for(int i=0;i<len;i++)
        {
            for(int j=0;j<len;j++)
            {
                if(l[k].s[i]==ss[j])
                    dp[i+1][j+1]=max(dp[i][j]+1,max(dp[i+1][j],dp[i][j+1]));
                else
                    dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);

            } 
        }
        l[k].len=dp[len][len];
    // cout<<l[k].len<<endl;
    }
    sort(l+1,l+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        cout<<l[i].s<<endl;
    }
    return 0;
}

좋은 웹페이지 즐겨찾기