51nod 1154 迴文串劃分

這裏寫圖片描述

想了好久,突然看到了話題是動態規劃,就明白了。
先n^2預處理出來以每個字符結尾的迴文串。然後動規,對於每一個字符,要麼自成一家,要麼接在前面的字符上。

#include<cstdio>
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

string s;
vector<int> a[5050];
int f[5050];

int main(){
    cin >> s;
    int len = s.length();
    for(int i = 0; i < len; i++){
        int l = i, r = i;
        int tot;
        while(l >= 0 && r < len && s[l] == s[r]){
             a[r].push_back(l);
             l--, r++;
        }
    }
    for(int i = 0; i < len; i++){
        int l = i, r = i + 1;
        while(l >= 0 && r < len && s[l] == s[r]){
             a[r].push_back(l);
             l--, r++;
        }
    }
    f[0] = 1;
    for(int i = 1; i < len; i++){
        f[i] = f[i - 1] + 1;
        for(int j = 0; j < a[i].size(); j++){
            int t = a[i][j];
            if(t == 0) f[i] = 1;
            else f[i] = min(f[i], f[t - 1] + 1);
        }
    }
    printf("%d\n", f[len - 1]);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章