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

你可能感兴趣的:(version)