采用分治法
#include <iostream>
using namespace std;
bool is_palindrome(int items[], int n) //检测是否是回文序列
{
if (n == 0)
return true;
int i, j;
i = 0;
j = n - 1;
while (i < j)
{
if (items[i] == items[j])
{
i++;
j--;
}
else
{
return false;
}
}
return true;
}
int become_palindrome(int items[], int n) //变成回文序列,并返回次数
{
int count = 0;
if (is_palindrome(items, n))
{
count = 0;
return count;
}
else
{
int i, j, k;
i = 0, j = n - 1 - i;
while (items[i] == items[j]) //找到对称的两边不相等的地方
{
i++;
j--;
}
if (items[i] < items[j]) //调整
{
int *items2 = new int[n - 1];
for (k = 0; k < i; k++)
{
items2[k] = items[k];
}
items2[i] = items[i] + items[i + 1];
for (k = i + 1; k < n - 1; k++)
{
items2[k] = items[k + 1];
}
count = become_palindrome(items2, n - 1) + 1; //返回调整次数
return count;
}
else
{
int *items2 = new int[n - 1];
for (k = 0; k < j - 1; k++)
{
items2[k] = items[k];
}
items2[j - 1] = items[j - 1] + items[j];
for (k = j; k < n - 1; k++)
{
items[k] = items[k + 1];
}
count = become_palindrome(items2, n - 1) + 1;
return count;
}
}
}
int main(void)
{
int num, i;
cin >> num;
int *items = new int[num];
for (i = 0; i < num; i++)
cin >> items[i];
cout << become_palindrome(items, num) << endl;
return 0;
}