題解 回文陣列

2021-10-08 15:09:15 字數 1419 閱讀 5726

給定有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 5

30%的資料

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 那麼我...