MemSQL start[c]up Round 2 - online version(DP)

只有小写字母 那>=2600的直接找单字母串长度大于等于100的就可以了

<2600 的dp找最长回文串

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 using namespace std;
 8 #define N 50010
 9 char s[N];
10 char pa[2610];
11 int dp[2610][2610][2],g,n,o[30];
12 void dfs(int ss,int i,int j,int k)
13 {
14     if(ss==0)
15     return ;
16     if(i==j)
17     {
18         pa[g++] = s[i];
19         return ;
20     }
21     if(i!=n-1&&j&&s[i]==s[j]&&dp[i][j][k]==dp[i+1][j-1][k]+2)
22     {
23 
24         pa[g++] = s[i];
25         dfs(dp[i+1][j-1][k],i+1,j-1,k);
26         return ;
27     }
28     if(i!=n-1&&dp[i][j][k]==dp[i+1][j][k])
29     {
30         dfs(dp[i+1][j][k],i+1,j,k);
31         return ;
32     }
33     if(j&&dp[i][j][k]==dp[i][j-1][k])
34     {
35         dfs(dp[i][j-1][k],i,j-1,k);
36         return ;
37     }
38 }
39 int main()
40 {
41     int i,j,d;
42     cin>>s;
43     int k = strlen(s);
44     n = k;
45     if(k>=2600)
46     {
47         for(i = 0; i < k ; i++)
48         o[s[i]-'a']++;
49         for(i = 0 ; i < 26 ; i++)
50         if(o[i]>=100)
51         {
52             d = i;
53             break;
54         }
55         for(i = 1 ; i <= 100 ; i++)
56         printf("%c",d+'a');
57         puts("");
58     }
59     else
60     {
61         for(i = 0 ; i < k ; i++)
62         {
63             dp[i][i][0] = 1;
64         }
65         for(i = k-1 ; i >= 0 ;i--)
66             for(j = i+1 ; j < k ; j++)
67             {
68                 if(s[i]==s[j])
69                 {
70                     dp[i][j][0] = dp[i+1][j-1][0]+2;
71                     dp[i][j][1] = dp[i+1][j-1][1]+2;
72                 }
73                 dp[i][j][0] = max(dp[i][j][0],max(dp[i+1][j][0],dp[i][j-1][0]));
74 
75                 dp[i][j][1] = max(dp[i][j][1],max(dp[i+1][j][1],dp[i][j-1][1]));
76             }
77     }
78     if(dp[0][k-1][1]>=100)
79     {
80         dfs(dp[0][k-1][1],0,k-1,1);
81         for(i = 0 ; i < 50 ; i++)
82         printf("%c",pa[i]);
83         for(i = 50-1 ; i >= 0 ; i--)
84         printf("%c",pa[i]);
85         puts("");
86     }
87     else
88     {
89         dfs(dp[0][k-1][0],0,k-1,0);
90         for(i = 0 ; i < g ; i++)
91         printf("%c",pa[i]);
92         if(dp[0][k-1][0]%2!=0)
93         g--;
94         for(i = g-1 ; i >= 0 ; i--)
95         printf("%c",pa[i]);
96         puts("");
97     }
98     return 0;
99 }
View Code

posted @ 2013-10-20 21:44  _雨  阅读(262)  评论(0编辑  收藏  举报