ch2_8_3求解迴文序列問題(遞迴實現)

劉堯允發表於2019-03-07

思路:迴文序列中左右兩邊的值一定相等,所以可以將該問題分解為兩邊化為相同元素操作的次數和去掉兩邊相等元素後後剩下元素變成迴文序列的操作次數。

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

輸出

2
import java.util.Scanner;

public class ch2_8_3求解迴文序列問題 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		int a[]=new int[n];
		for(int i=0;i<n;i++) {
			a[i]=in.nextInt();
		}


		System.out.println(f(a,0,a.length-1));
	}

		static int ans=0;//操作次數初始化為0
	private static int f(int[] a, int s, int e) {
		// TODO Auto-generated method stub
			int i=s,j=e;//i指向需要比較的左端元素,j指向需要比較的右端元素
			while(a[i]!=a[j]&&i<j) {//如果兩端元素不相等,則調整陣列,使兩端元素相等
				ans++;    //操作次數+1
				if(a[i]<a[j]) {//左端元素小於右端元素,則將左邊元素加到該元素的右邊元素上
					a[i+1]+=a[i];
					i++;//指向下一個要比較的元素
				}
				else if(a[i]>a[j]) {//右端元素小於左端元素,則將右邊元素加到該元素的左邊元素上
					a[j-1]+=a[j];
					j--;
				}

			}
			if(i<j)
				return f(a,i+1,j-1);//縮小規模
			else
				return ans;		
	}
}

 

相關文章