c 使用遞迴求解回文序列問題

2021-09-27 04:34:37 字數 1301 閱讀 4367

問題描述:

如果乙個數字序列逆置之後跟原序列是一樣的就稱這樣的數字串行為回文序列。

例如:, , 是回文序列,

, , 不是回文序列。

現在給出乙個數字序列,允許使用一種轉換操作:

選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置(只插入乙個和)。

現在對於所給序列要求出最少需要多少次操作可以將其變成回文序列。

輸入描述:

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

輸出描述:

輸出乙個數,表示最少需要的轉換次數

示例

輸入

4 1 1 1 3

輸出

2問題分析:每次加兩個數,並將兩個數之和代替前一位而刪除後一位,求出使輸入的序列變為回文序列的最少次數

演算法設計:要使序列變為回文則正序與逆序序列相同,所以第乙個必須是等於最後乙個的,因為每次操作只能對連續的兩個數進行操作,所以如果第乙個與最後乙個不相同的話 必須要與鄰近的乙個數相加,操作次數加一,若相同的話則與第乙個和最後乙個無關,將其去掉,問題規模減小,直到最後只剩乙個數或0個數

演算法實現:

// 190916-class_遞迴_回文序列.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。

//#include #includeusing namespace std;

int trans(vectorv);

int main()

cout << trans(v) << endl;

}int trans(vectorv)

else if (v[0] < v[len - 1])

else

return k;

}

執行結果:

演算法分析:了解回文的特點,順序逆序相同,所以乙個回文序列前後必須相同,不妨就從前**手,因為若前後不同則無法避免要相加,這樣下來操作都是必須的則運算元就是最小的,若前後已經相同,則前後已與是否構成回文序列無關,從而可以採取遞迴的方法每一輪後將問題轉換為規模更小的問題

**經驗歸納:**思考時尋找乙個入手點,若所有操作都是必須的,則運算元就一定是最小運算元

求解回文序列問題(C )

問題描述 如果乙個數字序列逆置後跟原序列是一樣的,則稱這樣的數字串行為回文序列。例如,是回文序列,而 不是回文序列。現在給出乙個數字序列,允許使用一種轉換操作 選擇任意兩個相鄰的數,然後從序列中移除這兩個數,並將這兩個數的和插入到這兩個之前的位置 只插入乙個和 對於所給序列求出最少需要多少次操作可以...

遞迴求解全排列問題

遞迴求解全排列問題 求解思想 排列中每乙個數字,都有一次當最前單一綴的機會,例如 排列陣列 a 1.當a中只有1個數字的時候,a 1 則只有1個數字做單一字首和字尾,則只有一種 1!1 可能 a1,直接輸出 2.當a中只有2個數字的時候,a 2 則a1,a2分別有一次機會做單一字首的機會,2!2 3...

遞迴求解整數劃分問題

定義乙個陣列dnum用來儲存乙個劃分中的每個數,用show函式來對一次劃分進行一次輸出,運用遞迴的方法進行整數的劃分,遞迴的時時候考慮5種情況,分別是nm 1,n 1 m和 0 subject 計算機演算法設計與分析 title 整數劃分問題 輸出乙個整數的所有劃分並統計總劃分數 coder lea...