zoukankan      html  css  js  c++  java
  • Dynamic Programming [Beginner]~A

    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

    解题思路:题目大意:给定一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000.可以用dp。

    程序代码:

    #include"stdio.h"
    #include"iostream"
    #include"string.h"
    #include"algorithm"
    using namespace std;
    const int N=1010;
    const int INF = (1<<29);
    
    int n;
    int dp[N];
    char str[N];
    
    bool judge(int left, int right)
    {
     for(int i = left, j = right; i <= j; ++i, --j)
      if( str[i] != str[j] ) return false;
     return true;
    }
    
    int main()
    {
    
     scanf("%d", &n);
     int i, j;
     while(n--)
     {
      scanf("%s", str+1);
      int len = strlen(str+1);
      for(i = 1; i <= len; ++i)
       dp[i] = INF;
    
      dp[0] = 0;
      for(i = 1; i <= len; ++i)
      {
       for(j = 1; j <= i; ++j)
       {
        if( judge(j, i) )
         dp[i] = min(dp[i], dp[j-1]+1);
       }
      }
    
      printf("%d
    ", dp[len]);
     }
    
     return 0;
    }
    

     

  • 相关阅读:
    求长度的另一种方法(""+obj).Length
    XCode中如何使用事务
    最终版 Reflector v1.0 (+简单的反流程混淆)
    与ObjectDataSource共舞
    性能&分布式&NewLife.XCode对无限数据的支持
    XCode之第一次亲密接触
    5,ORM组件XCode(动手)
    你知道吗?多个类多线程环境下静态构造函数的执行顺序
    使用C#编写IDA插件 IDACSharp v1.0.2010.0605
    XCMS V1.0 Beta1 发布
  • 原文地址:https://www.cnblogs.com/chenchunhui/p/4934296.html
Copyright © 2011-2022 走看看