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;
}
}
相關文章
- 樹遞迴問題的求解遞迴
- 遞迴求解漢諾塔問題遞迴
- 遞迴問題遞迴
- 遞迴-*全排列問題遞迴
- 遞迴路徑問題遞迴
- 棧實現遞迴遞迴
- lambda實現遞迴遞迴
- 迴文數問題
- 回溯和遞迴實現迷宮問題(C語言)遞迴C語言
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- hdu2048遞迴問題遞迴
- hdu2049遞迴問題遞迴
- 邏輯迴歸求解二分類問題以及SPSS的實現邏輯迴歸SPSS
- 遞迴實現原則遞迴
- 最長迴文子序列(不連續) 可輸出迴文序列
- python-動態規劃的遞迴、非遞迴實現Python動態規劃遞迴
- 遞迴解決全排列問題遞迴
- 遞迴和非遞迴分別實現求n的階乘遞迴
- 全域性元件實現遞迴樹,避免迴圈引用元件遞迴
- Android遍歷所有控制元件的遞迴和非遞迴實現Android控制元件遞迴
- 遞迴和尾遞迴遞迴
- 尾遞迴實現深複製遞迴
- c#遞迴實現 階乘C#遞迴
- C#實現FFT(遞迴法)C#FFT遞迴
- 二分法的簡單實現——-遞迴和非遞迴遞迴
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 快速排序【遞迴】【非遞迴】排序遞迴
- 二十一、氣泡排序演算法——JAVA實現(遞迴與非遞迴)排序演算法Java遞迴
- python實現二叉樹及其七種遍歷方式(遞迴+非遞迴)Python二叉樹遞迴
- 用 Promise + 遞迴實現灌酒動畫Promise遞迴動畫
- Java實現多級選單(遞迴)Java遞迴
- 遞迴實現指數型列舉遞迴
- 歸併排序的非遞迴實現排序遞迴
- python3:遞迴解漢諾塔問題Python遞迴
- 遞迴遞迴
- 什麼是遞迴?遞迴和迴圈的異同遞迴
- JavaScript:利用遞迴實現物件深拷貝JavaScript遞迴物件
- Java實現遞迴查詢樹結構Java遞迴