URAL1635. Mnemonics and Palindromes(DP)

链接

先初始化一下所有的回文串 再O(n*n)DP

输出路径dfs 刚开始存所有回文 ME了 后来发现用不着 改了改了OK了 数据还挺强

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 using namespace std;
  7 #define N 4010
  8 #define INF 0xfffffff
  9 int dp[N];
 10 char s[4010];
 11 int path[2][4010],o[4010],q[4010][4010],k;
 12 int g,flag,pp[2];
 13 void init()
 14 {
 15     int i,j;
 16     k = strlen(s);
 17     for(i =0 ; i < k ; i++)
 18     {
 19         int tt=0;
 20         while(i-tt>=0&&i+tt<k&&s[i-tt]==s[i+tt])
 21         {
 22 
 23             g++;
 24             int x1 = i-tt,x2 = i+tt;
 25             o[x2]++;
 26             q[x2][o[x2]] = x1;
 27             tt++;
 28         }
 29         tt = 1;
 30         while(i-tt+1>=0&&i+tt<k&&s[i-tt+1]==s[i+tt])
 31         {
 32             g++;
 33             int x1 = i-tt+1,x2 = i+tt;
 34             o[x2]++;
 35             q[x2][o[x2]] = x1;
 36             tt++;
 37         }
 38     }
 39 }
 40 void dfs(int u,int d,int v)
 41 {
 42     if(flag) return ;
 43     path[0][v] = u;
 44     path[1][v] = d;
 45     int i,j;
 46     if(v==dp[k-1])
 47     {
 48         for(i = dp[k-1]; i > 1 ; i--)
 49         {
 50             for(j = path[0][i]; j <= path[1][i]; j++)
 51             printf("%c",s[j]);
 52             printf(" ");
 53         }
 54         for(j = path[0][1]; j <= path[1][1]; j++)
 55             printf("%c",s[j]);
 56         puts("");
 57         flag = 1;
 58         return ;
 59     }
 60     for(i = 1 ; i <= o[u-1] ; i++)
 61     {
 62         if(q[u-1][i]==0)
 63         dfs(q[u-1][i],u-1,v+1);
 64         else
 65         if(dp[u-1]==dp[q[u-1][i]-1]+1)
 66         {
 67             dfs(q[u-1][i],u-1,v+1);
 68         }
 69     }
 70 }
 71 int main()
 72 {
 73     int i,j;
 74     scanf("%s",s);
 75     init();
 76     for(i = 1 ; i <= k ; i++)
 77     dp[i] = INF;
 78     dp[0] = 0;
 79     for(i = 0; i < k ;i++)
 80     {
 81         if(o[i])
 82         {
 83             for(j = 1;j <= o[i] ; j++)
 84             {
 85                 if(q[i][j]==0)
 86                 {
 87                     dp[i] = 1;
 88                     pp[1] = i;
 89                     pp[0] = q[i][j];
 90                 }
 91                 else if(dp[i]>dp[q[i][j]-1]+1)
 92                 {
 93                      dp[i] = dp[q[i][j]-1]+1;
 94                      pp[0] = q[i][j];
 95                      pp[1] = i;
 96                 }
 97             }
 98         }
 99     }
100     printf("%d
",dp[k-1]);
101     dfs(pp[0],pp[1],1);
102     return 0;
103 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3306273.html