1. 程式人生 > >求解迴文序列問題

求解迴文序列問題

【問題描述】如果一個數字序列逆置後跟原序列是一樣的,則稱這樣的數字序列為迴文序列。

  例如:{1,2,1}、{15,78,78,15}、{11,2,11}是迴文序列,而{1,2,2}、{15,78,87,51}、{112,2,11}不是迴文序列。現在給出一個數字序列,允許使用一種轉換操作:選擇任意兩個相鄰的數,然後從序列中移除這兩個數,並將這兩個數的和插入到這兩個數之前的位置(只插入一個和)。

  對於所給的序列求出至少需要多少次操作可以將其變成迴文序列。

  輸入描述:輸入為兩行,第一行為序列長度n(1<=n<=50),第二行為序列中的n個整數item[i](1<=item[i]<=1000),以空格分隔。

  輸出描述:輸出一個數,表示最少需要的轉換次數。

  輸入樣例:

    4

    1 1 1 3

  樣例輸出

    2

【解】

 

 1 #include<stdio.h>
 2 int hui(int a[],int n,int i,int j,int t)
 3 {
 4     if(i>=j)return(t);
 5     else if(a[i]==a[j])hui(a,n,i+1,j-1,t);
 6     else if(a[i]<a[j])
 7     {
 8         a[i]+=a[i+1];
 9
int k; 10 for(k=i+1;k<n;k++) 11 { 12 a[k]=a[k+1]; 13 } 14 hui(a,n-1,i,j-1,t+1); 15 } 16 else if(a[i]>a[j]) 17 { 18 a[j-1]+=a[j]; 19 int k; 20 for(k=j;k<n;k++) 21 { 22 a[k]==a[k+1]; 23 }
24 hui(a,n-1,i,j-1,t+1); 25 } 26 } 27 28 int main() 29 { 30 int n; 31 printf("序列個數:"); 32 scanf("%d",&n); 33 int a[n]; 34 int k; 35 printf("輸入序列:"); 36 for(k=0;k<n;k++) 37 { 38 scanf("%d",&a[k]); 39 } 40 printf("次數:%d",hui(a,n,0,n-1,0)); 41 return 0; 42 }

【示例】