题目要求将一个字符串进行分割成n段之后, 每一段都是回文的, 求出最小的n
深深地感觉DFS的强大, 不是太懂dfs的我还没完全理解这题的解法,过段时间学了dfs再回来看看吧
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[1005], f[1005][1005];
char s[1005];
int l;
bool ok(int i, int j)
{
while(i < j)
{
if(s[i] != s[j])
return 0;
i++;
j--;
}
return 1;
}
void init()
{
l = strlen(s+1);
for(int i=1; i<=l; i++)
for(int j=i; j<=l; j++)
f[i][j] = ok(i, j);
for(int i=1; i<=l; i++)
dp[i] = -1;
}
int dfs(int k)
{
if(dp[k] != -1)
return dp[k];
if(f[k][l])
return dp[k] = 1;
dp[k] = l-k+1;
for(int i=k; i<l; i++)
if(f[k][i])
dp[k] = min(dp[k], 1+dfs(i+1));
return dp[k];
}
int main()
{
int t, ca = 1;
scanf("%d", &t);
getchar();
while(t--)
{
scanf("%s", s+1);
init();
printf("Case %d: %d\n", ca++, dfs(1));
}
return 0;
}