如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列爲迴文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是迴文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是迴文序列。
現在給出一個數字序列,允許使用一種轉換操作:
選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置(只插入一個和)。
現在對於所給序列要求出最少需要多少次操作可以將其變成迴文序列。
#include <iostream>
#include <vector>
using namespace std;
bool isPalindromic(vector<int>& vec)
{
auto iter = vec.begin();
auto reverseIter = vec.rbegin();
int i = 1;
while ( i <= vec.size()/2)
{
if (*iter++ != *reverseIter++)
return false;
i++;
}
return true;
}
int main()
{
int n;
vector<int> vec;
int num, counter = 0;
while (cin >> n)
{
for (int i = 0; i < n; i++)
{
cin>>num;
vec.push_back(num);
}
if (isPalindromic(vec))
cout<<counter<<endl;
else
{
while (!isPalindromic(vec))
{
auto iter = vec.begin();
auto reverseIter = vec.end();
reverseIter--;
while (*iter == *reverseIter)
{
iter++;
reverseIter--;
}
if ( *iter < *reverseIter)
{
int sum = *iter + *(iter + 1);
iter = vec.insert(iter, sum);
vec.erase(iter + 1, iter + 3);
counter++;
}
else
{
int sum = *reverseIter + *(--reverseIter);
vec.insert(reverseIter, sum);
vec.erase(reverseIter + 1, reverseIter + 3);
counter++;
}
}
cout<<counter<<endl;
counter = 0;
vec.clear();
}
}
}