#include<stdio.h>
#define max 3003
int f[max][max];
int main()
{
int min(int a,int b,int c);
int n,i,j,len;
int a[max]; //a[]接收队列
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
{
f[i][i]=0; //队列长度为1时,不需要做调整
scanf("%d",&a[i]);
}
for(len=1;len<=n;len++) //队列长度为len的时候,即从a[i]到a[j]
{
for(i=1;i<=n-len+1;i++)
{
j=len+i-1;
if(a[i]==a[j]) //若a[i]等于a[j],那么f[i][j]需要调整的次数就是f[i+1][j-1]需要调整的次数
{
f[i][j]=f[i+1][j-1];
}
else //若a[i]不等于a[j],那么,f[i+1][j-1] +1(对a[i]或a[j]换衣服)
{ //f[i+1][j]+1 (踢掉f[i]),f[i][j-1](踢掉f[j])的最小值
f[i][j]=min(f[i+1][j-1]+1,f[i+1][j]+1,f[i+1][j]+1);
}
}
}
printf("%d\n",f[1][n]);
}
}
int min(int a,int b,int c)
{
if(b<c)
{
return a>b? b:a;
}
else
{
return a>c? c:a;
}
}
相关题目:http://acm.cs.ecnu.edu.cn/problem.php?problemid=2119
疑问:对f[i][j]的一部分并没有初始化,为什么可以直接使用,系统自动赋值为0?