zoukankan      html  css  js  c++  java
  • 【Uva 11584】Partitioning by Palindromes

    Link:https://cn.vjudge.net/contest/170078#problem/G

    Description

    给你若干个只由小写字母组成的字符串;
    问你,这个字符串,最少能由多少个回文串组成;

    Solution

    用枚举中心点的方法,得到为回文串的子串;
    即bo[1010][1010];
    bo[i][j]为true,表示这一段是回文;
    否则不是回文;
    (回文在枚举的时候,有长度为奇数和长度为偶数两种情况,长度为奇数的,中心点只有一个,长度为偶数的中心点有两个)
    然后设dp[i]表示1..i这一段最少需要多少个回文串组成;

    dp[i]=min(dp[i],dp[j1]+1);
    bo[j][i]true
    dp[0]=0

    NumberOf WA

    0

    Reviw

    以为是最长回文子串那题。。

    Code

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define ms(x,y) memset(x,y,sizeof x)
    #define Open() freopen("F:\rush.txt","r",stdin)
    #define Close() ios::sync_with_stdio(0)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 1100;
    const int INF = 0x3f3f3f3f;
    
    int T,dp[N];
    char s[N];
    bool is[N][N];
    
    int main(){
        //Open();
        //Close();
        scanf("%d",&T);
        while (T--){
            ms(dp,INF);
            ms(is,0);
            scanf("%s",s+1);
            int len = strlen(s+1);
            rep1(i,1,len){
                is[i][i] = true;
                int l = i,r = i;
                while (l-1 >= 1 && r+1<=len){
                    l--,r++;
                    if (s[l]==s[r])
                        is[l][r] = true;
                    else
                        break;
                }
                l = i,r = i+1;
                if (r <= len && s[l]==s[r]){
                    is[l][r] = true;
                    while (l-1>=1 && r+1 <= len){
                        l--,r++;
                        if (s[l]==s[r])
                            is[l][r] = true;
                        else
                            break;
                    }
                }
            }
            dp[0] = 0;
            rep1(i,1,len){
                for (int j = 1;j <= i;j++)
                    if (is[j][i])
                        dp[i] = min(dp[i],dp[j-1]+1);
            }
            cout << dp[len] << endl;
        }
        return 0;
    }
    
    /*
        写完之后,明确每一步的作用
    */
    
    
  • 相关阅读:
    7进程、线程、协程
    架构
    5oop面向对象编程
    2流程控制
    redis
    1HTML
    3.函数、递归、模块
    2、变量、数据类型、运算符、流程控制
    一个小公司的性能测试工程师应该如何开展工作
    程序代码调优工具perf学习记录
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626203.html
Copyright © 2011-2022 走看看