回文串 動態dp UVA 11584

2022-08-13 21:45:12 字數 822 閱讀 7090

本題的大意其實很簡單,就是找回文串,大致的思路如下:

1. 確定乙個回文串,這裡用到了自定義的check函式原理如下:

傳入le, ri兩個值(定義從1開始), s+1 = aaadbccb.

a a a d b c c b 

1 2 3 4 5 6 7 8    

比如,le = 5, ri = 8. 則s[5] == s[8]成立

le++ ri--

再比較 s[6] == s[7]? 成立 

le++, ri--. 此時, le > ri  return true.

所以,這就是乙個字串。

2. 動態dp

定義個f[mx]函式用於動態dp

首先初始化f[n] = n;

然後check(j. i);

如果返回成true則進行動態規劃 f[i] = min(f[i], f[j-1]+1)

3. 輸出f[n]即可

下面是ac**:

#include #include 

#include

using

namespace

std;

const

int mx = 1000+10

;char

s[mx];

intf[mx];

bool check(int le, int

ri)

return

true;}

intmain()

}printf(

"%d\n

", f[n]);}}

view code

uva 11584 劃分回文串

線性dp問題 設d i 代表a 0 i 字元構成的串中劃分成回文串的最小個數 則有狀態轉移方程 d i min 可以這麼理解方程 d i 表示 0 i 範圍的最優方案,由最優子結構性質,d i 的表示也是由幾個最優項組成 d j 1.include using namespace std defin...

UVa11584 劃分回文串

判斷乙個字串能劃分成的最小回文串的個數 首先,分析問題,定義狀態 d i 為s 0 s i 的解,寫出狀態轉移方程 d i min d i 判斷條件?d j 1 inf 後面的判斷條件,就是s i s j 是否是回文串,為什麼?因為我們對於第i個字元,必然屬於從s j s i 的乙個回文串中,這是題...

Uva 11584,劃分成回文串

題意 乙個字串,將它劃分一下,使得每個串都是回文串,求最少的回文串個數。分析 d i 到第 i 個字元時的最優解 即最少劃分為幾個回文串 就有方程 d i min d j 1 其中s j 1,i 要是回文串 這樣一來,列舉就是o n 2 的複雜度,如果按照普通的判斷s j 1,i 是否是回文串,時間...