• UVA 11584 Paritioning by Palindromes(动态规划 回文)


    题目大意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串。比如racecar本身就是回文串;fastcar只能分成7个单字母的回文串;aaadbccb最少可分成3个回文串:aaa、d、bccb。字符串的长度不超过1000。

    分析:令dp[i]表示从第1个到第 i 个字符所组成的最少回文串数。

      我们考虑如果前k个字符构成了1个回文,那么前k+1个字符最多构成2个回文,如果这些字符都相同,那么也只是1个回文串。所以如果第 j 个字母到第 i 个字母能构成回文,那么dp[i] = min(dp[i],dp[j-1]+1);

    初始条件是:dp[i]=i;

    代码如下:

     1 # include<cstdio>
     2 # include<cstring>
     3 # include<iostream>
     4 using namespace std;
     5 char s[1005];
     6 int dp[1005];
     7 bool judge(int i,int j){
     8     for(int k=0;k<=(j-i)/2;k++)
     9         if(s[i+k] != s[j-k])
    10             return false;
    11         return true;
    12 }
    13 int main(){
    14     int T,i,j,len;
    15     scanf("%d",&T);
    16     while(T--){
    17         scanf("%s",s);
    18         dp[0] = 0;
    19         len =strlen(s);
    20         for(i=1; i<=strlen(s);i++){
    21             dp[i] = i;
    22             for(j=1;j<=i;j++){
    23                 if(judge(j-1,i-1))
    24                     dp[i] = min(dp[i],dp[j-1]+1);
    25             }
    26         }
    27         printf("%d
    ",dp[len]);
    28     }
    29     return 0;
    30 }
  • 相关阅读:
    5、Hystrix服务熔断(服务端)与服务降级(客户端)
    迷宫回溯问题
    4、负载均衡:Ribbon、Feign
    PHP-删除排序数组中的重复项
    MYSQL-连续出现的数字
    PHP
    MYSQL分数排名
    MYSQL查询第二高的薪水
    PHP算法之有效的括号
    PHP算法之电话号码的字母组合
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/3217406.html
Copyright © 2020-2023  润新知