如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。
输入描述:
输入为两行,第一行为序列长度n ( 1 ≤ n ≤ 50) 第二行为序列中的n个整数item[i] (1 ≤ iteam[i] ≤ 1000),以空格分隔。
输出描述:
输出一个数,表示最少需要的转换次数
输入例子:
4 1 1 1 3
输出例子:
2
#include<iostream>
using namespace std;
int checkReserve(int* item, int num)
{
int i=0,j=num-1;
while(i<=j)
{
if(item[i++]!=item[j--])
return --i;
}
return -1;
}
int merge(int* item, int pos, int num)
{
if(pos+1 >= num){
return -1;
}
item[pos]+=item[pos+1];
for(int i=pos+1;i<num-1;i++)
{
item[i]=item[i+1];
}
return num-1;
}
int getMinChange(int* item,int num)
{
int pos=0,end=num-1;
int count=0;
while(pos<end){
pos=checkReserve(item,num);
if(pos==-1)
return count;
end=num-pos-1;
if(pos>end)
return count;
if(item[pos]<item[end]){
num = merge(item, pos, num);
}else{
num = merge(item, end-1, num);
}
count++;
}
return count;
}
int main()
{
int num;
cin>>num;
int* item = new int[num];
for(int i=0;i<num;i++)
{
cin>>item[i];
}
cout<<getMinChange(item, num);
return 0;
}