ch2_8_3求解迴文序列問題(遞迴實現)
思路:迴文序列中左右兩邊的值一定相等,所以可以將該問題分解為兩邊化為相同元素操作的次數和去掉兩邊相等元素後後剩下元素變成迴文序列的操作次數。
題目:
如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列為迴文序列。例如:
{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;
}
}
相關文章
- 樹遞迴問題的求解遞迴
- 遞迴實現漢諾塔問題遞迴
- 原:八皇后問題的遞迴和非遞迴Java實現遞迴Java
- 棧實現遞迴遞迴
- lambda實現遞迴遞迴
- 遞迴路徑問題遞迴
- 兩種遞迴方式實現迴文字遞迴
- 回溯和遞迴實現迷宮問題(C語言)遞迴C語言
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- 遞迴實現原則遞迴
- strcmp的遞迴實現遞迴
- 面試題—Java遞迴實現約瑟夫環面試題Java遞迴
- 爬臺階問題(遞迴和動態規劃實現)遞迴動態規劃
- (迴文串)leetcode各種迴文串問題LeetCode
- 邏輯迴歸求解二分類問題以及SPSS的實現邏輯迴歸SPSS
- 遞迴解決全排列問題遞迴
- hdu2048遞迴問題遞迴
- hdu2049遞迴問題遞迴
- python-動態規劃的遞迴、非遞迴實現Python動態規劃遞迴
- 遞迴和非遞迴分別實現求n的階乘遞迴
- 斐波那契數列的遞迴和非遞迴實現遞迴
- oracle中的遞迴sql查詢 connect by prior實現遞迴Oracle遞迴SQL
- C語言用遞迴方法求解階乘C語言遞迴
- 遞迴求解陣列中的最大值遞迴陣列
- 全域性元件實現遞迴樹,避免迴圈引用元件遞迴
- 遞迴和尾遞迴遞迴
- 遞迴思想----解決飲料問題遞迴
- Josephus問題解決方法五(遞迴)遞迴
- 尾遞迴實現深複製遞迴
- 用 Promise + 遞迴實現灌酒動畫Promise遞迴動畫
- C#實現FFT(遞迴法)C#FFT遞迴
- 遞迴實現指數型列舉遞迴
- 如何遞迴實現陣列求和遞迴陣列
- c#遞迴實現 階乘C#遞迴
- 快速排序【遞迴】【非遞迴】排序遞迴
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 二分法的簡單實現——-遞迴和非遞迴遞迴
- Android遍歷所有控制元件的遞迴和非遞迴實現Android控制元件遞迴