思路: DP[l][r]表示从l~r之间是DP[l][r]级回文串,当满足str[l] == str[r] && DP[l + 1][r - 1] != 0 时 DP[l][r] = DP[l][r - (r - l)/2 - 1] + 1,否则DP[l][r] = 0。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 5005
using namespace std;
int DP[MAX][MAX];
int main( )
{
char str[MAX];
cin >> str;
int len = strlen(str);
for(int j = 0; j < len; j++)
if(str[j] == str[j + 1]) DP[j][j + 1] = 2,DP[j][j] = 1;
else DP[j][j] = 1;
int dif;
for(int j = 2; j < len; j++){
for(int k = j - 2; k >= 0; k--){
if(str[j] == str[k] && DP[k + 1][j - 1] != 0){
dif = (j - k)/2 + 1;
DP[k][j] = DP[k][j - dif] + 1;
}
//原来写法:
/*if(str[j] == str[k]){
dif = (j - k)/2 + 1;
if(DP[k][j - dif] != 0 && DP[k + dif][j] != 0) DP[k][j] = DP[k][j - dif] + 1;
else if(DP[k + 1][j - 1] != 0) DP[k][j] = 1;
}*/
//hack date: abaaca
}
}
/* for(int j = 0; j < len; j++){
for(int k = 0; k < len; k++)
cout << DP[j][k] << " ";
cout << endl;
}*/
int ans[MAX] = {0};
for(int j = 0; j < len; j++)
for(int k = j; k < len; k++)
while(DP[j][k] > 0) ans[DP[j][k]--]++;
for(int j = 1; j <= len; j++)
cout << ans[j] << " ";
cout << endl;
}
在晚上打的时候都WA6,在补题中看了眼题解的后马上就明白了。但是,也不明白自己原来是怎么WA的,最后还是想出了一组数据成功证明我原来写的是错的。