唉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; }
还有!!今天vj上交题弹出一长串绿的,仔细一看是HAPPY NEW YEAR! 我当时一整个惊喜,cf,真有你的。