在数字的排列相反而与原来的排列相同的情况下,这种数字的排列称为回文的排列。 例如,{ 1,2,1 }、{ 15,78,78,15 }、{112}不是回文串,{ 1,2,2 }、{ 15,78,87,51 }、{ 112,2,11 }不是回文串现在可以使用选择任意两个相邻的数据,从序列中删除两个数据,然后用两个数据之和插入到两个数据的当前位置的转换操作。 当前,对于给定的序列,要求至少有几次操作是回文序列。 输入说明:的是两行,第1行动作序列的长度nn50 )输入第2行动作序列的n个整数item[I](1iteam[I]1000 ),用空格分隔。 输出记述:输出表示最低必要的转换次数的输入例: 41 1 1 3输出例: 2的想法的数据。 对于数字列,分别使用起始索引head和末尾索引tail这2个索引,从两端接近中间。 在头索引的值小的情况下,将头索引的数值与下一个元素相加。 将得到的和存储在head索引中,直到等于或大于tail索引中的值。 如果tail索引值较低,则tail索引值将与上一个元素相加,且大于或等于“头”索引值。 然后,得到的和存储在tail索引中。 在加法的过程中,被加法运算的次数是被合并的次数,如果两个索引的值相等,则两个索引被同时存储。如果head大于等于tail,则回文序列的构建成功。
# include iostream # includevectorusingnamespacestd; intpalindrome(vectorintitem,int head,int tail ); int main () { int n,a; cinn; vectorint item; while(Cina ) item.push_back(a ) a; 计数比例(item,0,n-1 ); 返回0; }intpalindrome(vectorintitem,int head,int tail ) { int left=item[head],right=item[tail]; int times=0; while (头部!=right () if (left right ) ) { left=item[ head]; 时间; } else{ right=item[–tail]; 时间; }if(head=tail )返回时间; Elsereturntimespalindrome(item,head,–tail ); }