题意:给你一连串字符串,问你下一个字符串尾字母等于前一个字符首字母,最后一个字符串尾字母等于首串首字母,这样的构造出的字符串最长为多少。
解题思路:dp[i][j] 表示以 i 字母开头 j 字母结尾 的最长字符串。
解题代码:
1 // File Name: 191a.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月10日 星期二 18时44分56秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 #define maxn 500005 26 using namespace std; 27 char str[20]; 28 char str1[20]; 29 int dp[30][30]; 30 int main(){ 31 int n; 32 scanf("%d",&n); 33 memset(dp,0,sizeof(dp)); 34 for(int i = 1;i <= n;i++) 35 { 36 scanf("%s",str1); 37 int be = str1[0] - 'a'; 38 int en = str1[strlen(str1)-1] - 'a' ; 39 //printf("%d ",strlen(str1)); 40 for(int i = 0 ;i < 26 ;i ++) 41 if(dp[i][be] != 0 ) 42 dp[i][en] = max(dp[i][be]+ int(strlen(str1)),dp[i][en]); 43 dp[be][en] = max(dp[be][en],int(strlen(str1))); 44 } 45 /*for(int i = 0 ;i < 26;i ++) 46 { 47 for(int j = 0 ;j < 26;j ++) 48 { 49 printf("%d ",dp[i][j]); 50 } 51 printf(" "); 52 }*/ 53 int mx = 0 ; 54 for(int i = 0;i < 26;i ++) 55 mx = max(dp[i][i],mx); 56 printf("%d ",mx); 57 return 0; 58 }