1. 程式人生 > >構造迴文數操作_網易程式設計

構造迴文數操作_網易程式設計

如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列為迴文序列。例如:
{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

思路:每次只考慮數列的首尾即可,序列用(a0,a1,,,an-1)表示,如果首尾相等那麼就是對(a1,a2,,,,an-2)在進行判斷。首尾不等的時候有兩種情況,首部小,那麼就將首部的臨近兩個相加,運算元加一,並對(a2,a3,,,an-1)在進行判斷;尾部小,那麼將尾部的兩個元素相加,運算元加一,並對(a1,a2,,,,an-2)進行判斷。

int GetCnt(int *arr, int len)
{
	
	int front = 0;//陣列之首
	int end = len - 1;//陣列尾
	int count = 0;

	//對比陣列首尾,如果相等那麼就去掉隊首隊尾
	while (front < end)
	{
		if (arr[front] < arr[end])
		{
			arr[front + 1] += arr[front];
			front++;
			count++;
		}
		else if (arr[front]>arr[end])
		{
			arr[end - 1] += arr[end];
			end--;
			count++;
		}
		else
		{
			front++;
			end--;
		}
	}

	return count;
}