51nod 1154 回文串划分

来源:互联网 发布:电脑版淘宝网站 编辑:程序博客网 时间:2024/05/16 06:34

这里写图片描述

想了好久,突然看到了话题是动态规划,就明白了。
先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;}
原创粉丝点击