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;
    }
    

     

  • 相关阅读:
    eg_5
    浅谈Java中的Hashmap
    java中方法传入参数时:值传递还是址传递?
    重温概率学(一)期望、均值、标准差、方差
    博客搬家
    golang sync/atomic
    单机配置kafka和zookeeper
    异步消息队列组件
    2017总结
    看完轻松年薪30w+
  • 原文地址:https://www.cnblogs.com/chenchunhui/p/4934296.html
Copyright © 2011-2022 走看看