CodeForces-191A Dynasty Puzzles

Posted on 2021-12-25 16:38  Capterlliar  阅读(44)  评论(0编辑  收藏  举报

题单传送门

唉poj不知道什么时候能好,先上cf练着吧。

---------------正文---------------

王朝拼图,很好,很中二,我喜欢(

题意:按先后给出一些字符串,首尾相同的可以拼起来,排在后面的字符串只能接在前面的字符串之后,问最后首尾相同的字符串最长是多少。

解:一开始想的是dp[i]表示到第i个,首尾相同的字符串最长的长度。但这显然和新加的字符串关系不大。

正解:dp[i][j]表示以i开头j结尾的字符串最长长度,这样就很好转移啦。注意自己更新自己放在后面,不过样例提示了这一点,很良心了xxx

代码:

#include<stdio.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stdlib.h>
#include <string>
using namespace std;
#define ll long long
#define maxx 500005
#define eps 0.00000001
#define inf 0x3f
//#define int long long
string a[maxx];
int dp[30][30]={0};
signed main() {
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    for(int i=0;i<n;i++){
        int len=a[i].length();
        int s=a[i][0]-'a';
        int e=a[i][len-1]-'a';
        for(int j=0;j<26;j++)
            if(dp[j][s])
                dp[j][e]=max(dp[j][e],dp[j][s]+len);
        dp[s][e]=max(dp[s][e],len);
    }
    int ans=0;
    for(int i=0;i<26;i++) {
        ans=max(ans,dp[i][i]);
    }
    cout<<ans<<endl;
    return 0;
}
View Code

还有!!今天vj上交题弹出一长串绿的,仔细一看是HAPPY NEW YEAR! 我当时一整个惊喜,cf,真有你的。