給定有n個整數的陣列a,下標從1到n。如果對每乙個下標i均滿足a[i] =a[n-i+1],則稱陣列是回文的。例如,陣列a=就是回文陣列。
如果陣列a不是回文的,可以採用合併兩個相鄰元素的方法去得到回文陣列。注意,每操作一次,陣列的元素數量減少1。
例如,陣列a=不是回文陣列,但是通過合併a[1]和a[2],得到就是回文陣列了。
顯然,無論給出怎樣的陣列元素,最多經過n-1次操作,合併為乙個數時,陣列a一定是回文陣列了。
因此,本題一定有解。
然而問題來了:對於給定的陣列a,最少經過多少次操作,能讓a變成回文陣列?
第1行:1個整數n,表示陣列a的元素個數第2行:n個空格分開的整數,表示陣列a
第1行:1個整數,表示最少的操作次數樣例輸入
4
1 4 3 2
樣例輸出
2
1 4 3 2 -> 5 3 2 -> 5 530%的資料
1 ≤ n ≤ 10
60%的資料
1 ≤ n ≤ 1000
100%的資料
1 ≤ n ≤ 106 1 ≤ a[i] ≤ 109
我第一次做的時候搞反了,就差了一丟丟我們設定兩個指標l,r,從兩邊開始比較
製作兩個函式
int pre(int index)
int suf(int index)
有以下三種情況如果pre(l)>suf( r),則使得r - -
如果pre(l)如果pre(l)=suf( r),則使得l ++, r - -
當然,我們可以不用字首和與字尾和,直接用原陣列累加即可(情況三可以不用累加,直接跳過)
#include
#include
using
namespace std;
const
int m =
1e6+5;
int a[m]
;int ans, n;
intmain()
for(
int l =
1, r = n; l < r;)if
(a[l]
> a[r])if
(a[l]
== a[r])}
printf
("%d"
, ans)
;return0;
}
回文詞 題解
題目描述 回文詞是一種對稱的字串 也就是說,乙個回文詞,從左到右讀和從右到左讀得到的結果是一樣的。任意給定乙個字串,通過插入若干字元,都可以變成乙個回文詞。你的任務是寫乙個程式,求出將給定字串變成回文詞所需插入的最少字元數。比如字串 ab3bd 在插入兩個字元後可以變成乙個回文詞 dab3bad 或...
回文日期 題解
方法一 輸入起始結束日期 9for i 1 i 12 i 10 20 21 cout 22return0 23 方法二 1 include2 using namespace std 3int main 4 列出每個月份對應的最大天數,注意2月份用最大29天 7 cin date1 date2 輸入起...
回文檢測題解
題目右轉luogu1210 我看到這道題的第一想法是列舉答案 長度 但是很顯然會超時,怎樣優化列舉是關鍵 我想到了二分答案。但是二分答案要求答案具有單調性。乍一看,似乎回文子串沒什麼單調性。但是如果我們將答案分為奇偶兩種,答案的單調性就出來了 1.當最長回文串長度是奇數時 不妨假設長度為 9 那麼我...