思路:參考了網上,思路很清奇,借助vis[i][j]來表示從i到j是否為回文串,回文串這邊是用的雙重迴圈來寫的;dp[i]用來表示以i結尾的字串最少的回文串有多長。
#include#include#include
using
namespace
std;
const
int maxn = 5e3 + 10
;int dp[maxn];//
dp[i]表示的是以第i個字元結尾的最少劃分數
//dp[i] = min(dp[i],dp[j]+1) 當j到i是回文串時
char
s[maxn];
bool vis[maxn][maxn];//
vis[i][j]表示i到j的字串是否是回文串
intmain()
else
if (vis[j + 1][i - 1] && s[i] ==s[j])}}
cout
<< dp[len - 1] <
return0;
}
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位...