如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{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),以空格分隔。
输出描述:
输出一个数,表示最少需要的转换次数
输入例子1:
4
1 1 1 3
输出例子1:
2
解法:
该题的解法思路是数组的前后各保持一个索引,分别记作 , beigin(i) 和 end(j)
如果发现beigin(i)小于end(j),那么把 beigin(i+1)=beigin(i)+beigin(i+1),同时i++;
如果发现beigin(i)大于end(j),那么把end(j-1)=end(j-1)+end(j),同时j–;
如果相等,则i++,j–;
直到i>=j;
程序:
import java.util.Scanner;
/**
* Created by wubo on 2017/8/12.
*/
public class Main {
public static void main(String args[]){
Scanner scanner=new Scanner(System.in);
int N= scanner.nextInt();
int item[] =new int[N];
for (int i=0;i<N;i++){
item[i]=scanner.nextInt();
}
int i=0,j=N-1;
int step=0;
while(i<j){
if (item[i]<item[j]){
item[i+1]+=item[i];
i++;
step++;
}else if(item[i]>item[j]){
item[j-1]+=item[j];
j--;
step++;
}else{
++i;
--j;
}
}
System.out.println(step);
}
}