本題的大意其實很簡單,就是找回文串,大致的思路如下:
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 #includeview code#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]);}}
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 是否是回文串,時間...