有乙個字串s,求s最少可以被劃分為多少個回文串。
例如:abbaabaa,有多種劃分方式。
a|bb|aabaa - 3 個回文串
a|bb|a|aba|a - 5 個回文串
a|b|b|a|a|b|a|a - 8 個回文串
其中第1種劃分方式的劃分數量最少。
input
輸入字串s(s的長度<= 5000)。output
輸出最少的劃分數量。input示例
abbaabaaoutput示例
3
題解:dp到該點位置最少的劃分量。n*n列舉i、j。
狀態轉移:dp[i+j] = min(dp[i+j],dp[i-j-1]+1);(s[i+j]==s[i-j])
dp[i+j+1] = min(dp[i+j+1],dp[i-j-1]+1);(s[i+j+1]==s[i-j])
**:#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
typedef pairp;
const int inf = 0x3f3f3f3f;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-10;
const int maxn = 5e3+7;
const int mod = 1e9+7;
char s[maxn];
int dp[maxn];
int main()
dp[0] = 0;
for(int i = 1;i <= n;i++)
j = 0;
while(i-j>=1&&i+j+1<=n&&s[i-j]==s[i+j+1])
}cout<
經驗:看題的時候想到了馬拉車,然後想到拓展kmp,然後是字尾陣列,當然都只是略過,沒深入想,看到n = 5000的時候就有暴力的想法,然後想到最小,然後然後就有了dp的想法。所以說,資料範圍還是很重要的。
回想起的知識點:
字串的處理演算法:
1、kmp
2、雜湊
3、拓展kmp
4、馬拉車(和3的演算法思路很像,和3一樣都是很強的演算法,都是o(n)理論最優演算法)
5、字尾陣列(用處很大,但是用到的比較少)(還有乙個是雜湊字尾陣列。。)
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...
1154 回文串劃分(dp)
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...
51nod1154回文串劃分
這道題目剛開始想錯了,本來打算每次找到最大的回文串,結果自己給自己駁倒了,比如dabbbbbdb,最長回文子串是bbbbb,結果四個落單,一共是五個,而如果把最後的bdb放在一組,就一目了然了,4個,所以這種是不行的,到底該如何做呢 dp j 代表了讀到第j個字元的時候出現的回文串最小有多少個 k ...