zoukankan      html  css  js  c++  java
  • UVA-11584

    We say a sequence of characters is a palindrome if it is the same written forwards and backwards. For example, ‘racecar’ is a palindrome, but ‘fastcar’ is not. A partition of a sequence of characters is a list of one or more disjoint non-empty groups of consecutive characters whose concatenation yields the initial sequence. For example, (‘race’, ‘car’) is a partition of ‘racecar’ into two groups. Given a sequence of characters, we can always create a partition of these characters such that each group in the partition is a palindrome! Given this observation it is natural to ask: what is the minimum number of groups needed for a given string such that every group is a palindrome?
    For example: • ‘racecar’ is already a palindrome, therefore it can be partitioned into one group. • ‘fastcar’ does not contain any non-trivial palindromes, so it must be partitioned as (‘f’, ‘a’, ‘s’, ‘t’, ‘c’, ‘a’, ‘r’). • ‘aaadbccb’ can be partitioned as (‘aaa’, ‘d’, ‘bccb’).
    Input
    Input begins with the number n of test cases. Each test case consists of a single line of between 1 and 1000 lowercase letters, with no whitespace within.
    Output
    For each test case, output a line containing the minimum number of groups required to partition the input into groups of palindromes.
    Sample Input
    3

    racecar

    fastcar

    aaadbccb


    Sample Output
    1

    7

    3

    题目大意:问最少的回文串的总数。

    思路:开始我想用manacher算法。只需要到时候处理一下就可以。但是还是想简单了。折腾了两个小时都没搞好。果断弃坑。ps:按理说应该是可以的,可能是我太马虎了。

    赛后发现原来是dp,真是藏的好深啊。。。

    因为题目数据是1000。时间限制3s。我们就用比较好理解的O(n3)的复杂度的方法吧。

    dp[ i ]表示前i个字符能构成的最小回文串总数。

    代码:

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #define INF 999999
    using namespace std;
    char a[1005];
    bool IsHuiWen(int l,int r){
        for(int j=l,i=r;j<=i;j++,i--){
            if(a[j]!=a[i])
                return false;
        }
        return true;
    }
    int main(){
        int T;
        cin>>T;
        while(T--){
            int dp[1005];
            scanf("%s",a+1);
            int len=strlen(a+1);
            for(int i=1;i<=len;i++){
                dp[i]=INF;
            }
            dp[0]=0;
            for(int i=1;i<=len;i++){
                for(int j=1;j<=i;j++){
                    if(IsHuiWen(j,i)){
                        dp[i]=min(dp[i],dp[j-1]+1); //如果j到i是回文串,那么我们就可以利用dp[j-1]的最少回文串来知道dp[i]的最少回文串。
                    }
                }
            }
            cout<<dp[len]<<endl;
        }
        return 0;
    }
  • 相关阅读:
    一行代码更改博客园皮肤
    fatal: refusing to merge unrelated histories
    使用 netcat 传输大文件
    linux 命令后台运行
    .net core 使用 Nlog 配置文件
    .net core 使用 Nlog 集成 exceptionless 配置文件
    Mysql不同字符串格式的连表查询
    Mongodb between 时间范围
    VS Code 使用 Debugger for Chrome 调试vue
    css权重说明
  • 原文地址:https://www.cnblogs.com/ISGuXing/p/7282052.html
Copyright © 2011-2022 走看看