哇很好的題..
發現在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位...