51nod 1154回文串劃分 dp 遞推

2021-07-09 14:48:19 字數 913 閱讀 1676

題意:

有乙個字串s,求s最少可以被劃分為多少個回文串。

例如:abbaabaa,有多種劃分方式。

a|bb|aabaa - 3 個回文串

a|bb|a|aba|a - 5 個回文串

a|b|b|a|a|b|a|a - 8 個回文串

其中第1種劃分方式的劃分數量最少。

分析:剛開始以為類似abab這樣的字串也是回文的,卡了好久,orz

dp[i]表示的是前i個字元組成的字串的最少劃分數量。

遞推公式為:

dp[i] =min (dp[i] , dp[j-1]+1)   當j<=i並且字元j到i組成的字串為回文的。

其中初始化為dp[i] = i ;

#include #include #include #include #include using namespace std;

int const maxn = 5005 ;

int dp[maxn];//dp[i]表示的是以第i個字元結尾的最少劃分數

//dp[i] = min(dp[i],dp[j]+1) 當j到i是回文串時

char str[maxn];

bool vis[maxn][maxn] ; //vis[i][j]表示的是從i到j的字串是否是回文串

int main()

dp[0]=1;

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

else if(vis[j+1][i-1]&&str[i]==str[j])}}

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

//

printf("%d\n",dp[n-1]);

}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位...