51nod 回文串劃分

2021-08-19 20:32:55 字數 1026 閱讀 1983

哇很好的題..

發現在dp中,找到"轉化的一步",列舉這一步非常重要.

這題首先是n2的處理出區間回文,一開始我一直想的是dp[i][j]來代表[i,j]之間最少劃分幾個,這個是容易的,但是會t,我想了幾個優化,其中乙個便是不是遍歷i,j中間每乙個點,而是直接選p,[i,p]為回文串,這樣可以提高速度,但是仍然不夠.我就想換乙個狀態.

dp[i],前i個最少劃分幾個,其實這個我很早有想到,但是不知道在利用前面的i時,中間那一段是處理不出來的,後來發現沒有必要,只需要遍歷從右端點往左的每乙個回文串,就可以了.因為顯然這樣也可以"覆蓋全部狀態".

#include 

#include

#include

using

namespace

std;

#define debug(x) std::cerr << #x << " = " << (x) << std::endl

typedef

long

long ll;

const

int maxn = 5e3 + 17;

const

int mod = 1e9 + 7;

bool dp[maxn][maxn];

int dpx[maxn];

vector

vec[maxn];

int main(int argc, char

const* argv)

for (int i = 0; i < n - 1; ++i)

for (int l = 3; l < n; ++l)

}for (int j = 0; j < n; ++j)

for (int i = 0; i < n; ++i) }}

for (int j = 0; j < n; ++j)

cout

<< dpx[n - 1] << endl;

return

0;}

51nod1154回文串劃分

這道題目剛開始想錯了,本來打算每次找到最大的回文串,結果自己給自己駁倒了,比如dabbbbbdb,最長回文子串是bbbbb,結果四個落單,一共是五個,而如果把最後的bdb放在一組,就一目了然了,4個,所以這種是不行的,到底該如何做呢 dp j 代表了讀到第j個字元的時候出現的回文串最小有多少個 k ...

51nod 1154 回文串劃分

1154 回文串劃分 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 有乙個字串s,求s最少可以被劃分為多少個回文串。例如 abbaabaa,有多種劃分方式。a bb aabaa 3 個回文串 a bb a aba a 5 個回文串 a b b a a b a a...

51Nod 1154回文串劃分

題目鏈結 有乙個字串s,求s最少可以被劃分為多少個回文串。例如abbaabaa,有多種劃分方式。a bb aabaa 3個回文串 a bb a aba a 5個回文串 a b b a a b a a 8個回文串 其中第一種劃分方式的劃分數量最少。輸入 abbaabaa 輸出 3 dp i 表示前i位...