codeforces 191A 线性DP

codeforces 191A


题意:

n 10 给定n个长度不超过10的字符串,收尾字母相同的字符串可以拼接在一起。
问最大环的长度。


题解:

d p [ i ] [ j ] i j dp[i][j]表示以字母i为首,字母j为尾所能组成的字符串的最大长度。
d p [ i [ [ i ] 先拼接后成环,遍历dp[i[[i]。

  • d p [ i ] [ r ] = m a x ( d p [ i ] [ r ] , d p [ i ] [ l ] + l e n ) 若前一个状态合法(序列不为空),dp[i][r] = max(dp[i][r], dp[i][l]+len)
  • d p [ l ] [ r ] = m a x ( d p [ l ] [ r ] , l e n ) 特判,dp[l][r] = max(dp[l][r], len)

#include <bits\stdc++.h>
using namespace std;
int dp[26][26];

int main() {
    int n;
    for(cin >> n ; n > 0 ; n--){
        string s;
        cin >> s;
        int len = s.size();
        int l = s[0]-'a';
        int r = s[len-1]-'a';
        for(int i = 0 ; i < 26 ; i++){
            if(dp[i][l]){
                dp[i][r] = max(dp[i][r], dp[i][l]+len);
            }
        }
        dp[l][r] = max(dp[l][r], len);
    }
    int ans = 0;
    for(int i = 0 ; i < 26 ; i++){
        ans = max(ans, dp[i][i]);
    }
    cout << ans << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/CSDN_PatrickStar/article/details/89792741