#include<iostream>
using namespace std;
//***************************常量定义***************************
const int MAX=5500;
const int MIN=3;
//**************************题目变量****************************
//全局变量全部初始化为0
int cNum;
short c[MAX][MAX];
char X[MAX];
//*************************算法变量*****************************
inline int min(int a,int b)
{
if(a<b) return a;
else
return b;
}
void cal(char* X)
{
for(int distance=1;distance<=cNum-1;distance++)
{
int i=1;
int j=i+distance;
while(j<=cNum)
{
if(1==distance)
{
if(*(X+i-1)==*(X+j-1))
c[i][j]=0;
else
c[i][j]=1;
}
else
{
if(*(X+i-1)==*(X+j-1))
c[i][j]=c[i+1][j-1];
else
c[i][j]=min(c[i+1][j],c[i][j-1])+1;
}
i++;
j=i+distance;
}
}
cout<<c[1][cNum];
}
int main()
{
cin>>cNum;
if((cNum<MIN)||(cNum>MAX))
return 0;
for(int i=0;i<cNum;i++)
cin>>X[i];
X[cNum]='\0';
cal(X);
}
注意实现:
1.数组<pre name="code" class="cpp">short c[MAX][MAX] 必须用short int,不然占用内存过大,无法AC
2.实现思路:
<pre name="code" class="cpp">for(int distance=1;distance<=cNum-1;distance++)
即计算从小到大的子串改造成回文所需的字符数。
3.尽量少用new来申请空间,new操作耗时太大。