• MemSQL start[c]up Round 2


    只有小写字母 那>=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

  • 相关阅读:
    深入理解sizeof
    trie树详解
    高精度计算
    编写高效的Android代码
    Android Architecture
    AIDL Android中的远程接口
    性能测试常见术语
    软件与软件测试相关
    注解实现Springmvc+jsp步骤
    非注解实现SpringMvc+JSP (一般用不到 主要用于了解研究底层)
  • 原文地址:https://www.cnblogs.com/shangyu/p/3379584.html
Copyright © 2020-2023  润新知