题意:
给出一个字符串,问它分别具有多少个k级字符串。
一个回文串叫做1级回文串,一个回文串为k级回文串当且仅当它的左半部分和右半部分相同,且两部分都是(k-1)级回文串。
思路:
很明显的区间dp问题, 有明显的dag关系, 然后就结束.
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5000 + 5;
int dp[maxn][maxn], num[maxn];
bool ok[maxn][maxn];
char s[maxn];
int main()
{
scanf("%s", s+1);
int len = strlen(s+1);
for(int i = 1; i <= len; i++)
{
dp[i][i] = 1;
ok[i][i] = 1;
}
num[1] = len;
for(int i = 2; i <= len; i++)
{
for(int j = 1; i+j-1 <= len; j++)
{
if(s[j] == s[i+j-1] )
{
if(j+1 == i+j-1 || ok[j+1][i+j-2])
{
ok[j][i+j-1] = 1;
int mid = (j+i+j-1)/2;
if(i&1) mid--;
dp[j][i+j-1] = dp[j][mid]+1;a
}
}
}
}
for(int i = 1; i <= len; i++)
{
for(int j = i+1; j <= len; j++)
{
num[dp[i][j]]++;
}
}
for(int i = len; i >= 1; i--)
{
num[i]+=num[i+1];
}
for(int i = 1; i <= len; i++)
printf("%d ", num[i]);
return 0;
}