Codeforces Round #121 (Div. 1) A. Dynasty Puzzles DP
链接:
http://codeforces.com/contest/191/problem/A
题意:
给出n个字符串,两个字符串如果前一个的尾与后一个的首相同,那么可以相连,最后得到的字符串要满足首尾相同,问最长的符合要求的字符串的长度是多少。
字符串必须按给出顺序相连
题解:
定义状态dp[i][j]代表以i开头以j结尾的最长的字符串的长度
开始的时候我45行写成了!dp[u][v],贡献了一次wa
代码:
31 int dp[26][26]; 32 33 int main() { 34 ios::sync_with_stdio(false), cin.tie(0); 35 int n; 36 cin >> n; 37 rep(i, 0, n) { 38 string s; 39 cin >> s; 40 int len = s.length(); 41 int u = s[0] - 'a'; 42 int v = s[len - 1] - 'a'; 43 rep(i, 0, 26) if (dp[i][u]) 44 dp[i][v] = max(dp[i][v], dp[i][u] + len); 45 if (len > dp[u][v]) dp[u][v] = len; 46 } 47 int ans = 0; 48 rep(i, 0, 26) ans = max(ans, dp[i][i]); 49 cout << ans << endl; 50 return 0; 51 }