思路(貪心):io
1.兩邊往中間逼近,步數少;class
2.單個字符出現時只考慮移動到中間的步數,不作移動,由於這是最後進行,不影響結果;移動
示例代碼:di
#include <stdio.h>
#define N 8000while
int main(void)
{
int n = 0 ;
int i = 0 , j = 0 , k = 0 , flag = 0 , sign = 0 , sum = 0;
char arr[N] ;
scanf("%d",&n);
scanf("%s",arr);co
k = n - 1 ; /*對稱位置*/
for (i = 0 ; i <= k ; i ++)
{
for (j = k ; j >= i ; j --)
{ 字符
/*出現單個字符*/
if (i == j)
{oss
if (n%2 == 0 || sign)
{
flag ++; /*第一次出現忽略*/
break;
}
sign ++;
sum += n/2 - i;
break;
}return
/*匹配到的迴文*/
if (arr[i] == arr[j])
{
sum += k - j;
while (j != k)
{
arr[j] = arr[j+1];
j ++;
}
arr[j] = arr[i];
k --;
break;
}
}
if (flag)
{
break;
}
}
if (flag)
{
printf("Impossible");
}
else
{
printf("%d",sum);
}
return 0;
}void