01./*
02.简单题
03.
04.求最长回文数,多阶段决策问题类动态规划
05.
06.题意:字符串S中包含的最长回文数为多长。即删除若干个字母后,剩余为回文数,问长度最长为多少。
07.
08.状态转移方程为:if(str[i]==str[j] && f[i+1][j-1]==j-i-1) f[i][j]=f[i+1][j-1]+2;
09.else f[i][j]=max(f[i+1][j],f[i][j-1]).
10.
11.*/
12.//#define TEST
13.#include <cstdio>
14.#include <cstring>
15.const int nMax=1005;//For ≥90% of the test cases, string length ≤ 255.
16.char str[nMax];
17.int T;
18.int len;
19.int f[nMax][nMax];
20.void init()
21.{
22. gets(str);
23. len=strlen(str);
24. for(int i=0;i<len;i++)
25. {
26. f[i][i]=1;
27. f[i+1][i]=0;
28. }
29.}
30.int max(int a,int b)
31.{
32. return a>b?a:b;
33.}
34.void solve()
35.{
36. for(int k=1;k<len;k++)
37. for(int i=0;i+k<len;i++)
38. {
39. if(str[i]==str[i+k] && f[i+1][i+k-1]==i+k-i-1)
40. f[i][i+k]=f[i+1][i+k-1]+2;
41. else
42. f[i][i+k]=max(f[i+1][i+k],f[i][i+k-1]);
43.#ifdef TEST
44. printf("%d %d %d\n",i,i+k,f[i][i+k]);
45.#endif
46. }
47.}
48.int main()
49.{
50. //freopen("f://data.in","r",stdin);
51. scanf("%d",&T);
52.
53. while(T--)
54. {
55. init();
56. solve();
57. printf("%d\n",f[0][len-1]);
58. }
59. return 0;
60.}
何为回文数,即正着念和反着念都是一样的数