• UVA 11584


    Problem H: Partitioning by Palindromes

    Can you read upside-down?

    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.

    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 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.

    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
    

    Kevin Waugh

    这道题倒是没什么可说的,简单的DP入门题 , 但我却在题以外的地方上WA了好久发火

    谁能告诉我ios::sync_with_stdio(false);再用cin ,cout 会判错!!!求科普!

    悬赏解答该问题!

    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <map>
    #include <string>
    #include <stack>
    #include <cctype>
    #include <vector>
    #include <queue>
    #include <set>
    
    using namespace std;
    const int MAXN = 1010 + 50;
    const int maxw = 100 + 20;
    const long long LLMAX = 0x7fffffffffffffffLL;
    const long long LLMIN = 0x8000000000000000LL;
    const int INF = 0x7fffffff;
    const int IMIN = 0x80000000;
    #define eps 1e10-8
    #define mod 1000000007
    typedef long long LL;
    const double PI = acos(-1.0);
    typedef double D;
    
    //#define Online_Judge
    #define outstars cout << "***********************" << endl;
    #define clr(a,b) memset(a,b,sizeof(a))
    
    #define FOR(i , x , n) for(int i = (x) ; i < (n) ; i++)
    #define FORR(i , x , n) for(int i = (x) ; i <= (n) ; i++)
    #define REP(i , x , n) for(int i = (x) ; i > (n) ; i--)
    #define REPP(i ,x , n) for(int i = (x) ; i >= (n) ; i--)
    char inp[MAXN];
    int state[MAXN];///记录从头到i的最少回文串数
    bool isPalindrome(int s , int t)
    {
        while(s < t)
        {
            if(inp[s] != inp[t])return false;
            s++;
            t--;
        }
        return true;
    }
    int main()
    {
        //ios::sync_with_stdio(false);
        #ifdef Online_Judge
            freopen("in.txt","r",stdin);
            freopen("out.txt","w",stdout);
        #endif // Online_Judge
        int T;
        cin >> T;
        while(T--)
        {
            scanf("%s",inp);
            int len = strlen(inp);
            FOR(i , 0 , len)state[i] = INF;
            state[0] = 1;
            FOR(i , 1 , len)FORR(j ,0 , i)
            {
                if(isPalindrome(j , i))
                {
                    if(j == 0)state[i] = min(state[i] , 1);
                    else state[i] = min(state[j - 1] + 1 , state[i]);
                }
            }
            printf("%d
    " , state[len - 1]);
        }
        return 0;
    }
    
    
  • 相关阅读:
    ASP.Net GBK 解码
    windows默认共享的打开和关闭?
    NET导出Excel遇到的80070005错误的解决方法
    JavaScript(一)
    博客开通
    java知识学习05-数据类型、变量、标识符、类型转换
    java知识学习04-注释、关键字、常量
    java知识学习03-第一个程序
    【转】Git 冲突:Your local changes would be overwritten by merge. Commit, stash or revert them to proceed.
    idea如何在Git上将分支代码合并到主分支
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3239172.html
Copyright © 2020-2023  润新知