今天带来一个简单的线性结构上的DP,与上次的照明系统(UVA11400)是同一种类型题,便于大家类比、总结、理解,但难度上降低了。

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!

正序倒序写都相同的字符串我们称之为回文串。例如,‘racecar’就是回文的,‘fastcar’就不是。对一个字符序列的划分即:分成一堆(至少一个)非空不相交的连续字符串,使它们连起来就是原来的字符序列。例如,‘race’,‘car’就是把‘racecar’划分成两组。给定一个字符串,我们总能找到一种划分使得每个子串都是回文串!(大不了一个字母算一个子串)

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

求:使得每个子串都是回文串的最小划分组数。

例如,‘racecar’本身就是个回文串所以它的答案是1组;‘fastcar’不含回文子串,只能一个字母一个字母地分,答案为7组;‘aaadbccb’最优可以分成‘aaa’,‘d’,‘bccb’3组。

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

最先输入测试组数n。每组给出一个长度1~1000的小写字母串,中间没有空格。

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

思路:

假如我遍历一遍字符串 ----> 强如‘fastcar’的话只能一个字母一个字母地苦逼+1,那么有回文子串时,差异是如何产生的呢? ----> 就说racecar吧。走到race的时候还是+1模式,再走一步到c的时候发现跟前面的ce能凑个cec ----> 我们用dp数组表示结果,dp[racec]本来等于dp[race]+1,由于找到了回文子串cec,所以变成了min( dp[race]+1, dp[ra]+1 ) ----> 由于我们不知道当前字母最早可以伸展到哪里去跟别人结合为回文子串,所以可以暴力扫一遍前面的 ----> 至于回文串,一边扫一遍判断也可以,预处理也可以,关键是复杂度。预处理可以枚举回文串中心然后向左右伸展得到(j,i)是不是回文串,可以以n²的复杂度求解,这样dp的过程也是n²。一边dp一边判断大概是n³的复杂度,我不知道怎么就过了我复杂度算错了?……

最开始瞎写的代码1:20ms

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; int T;
int dp[];
char str[]; bool ispalindrome(int start, int end)
{
for (int i = start; i < (start+end+)/; i++)
if (str[i] != str[start+end-i])
return false;
return true;
} int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%s", str+); int len = strlen(str+);
for (int i = ; i <= len; i++)
{
dp[i] = dp[i-] + ;
for (int j = ; j <= i-; j++)
if (ispalindrome(j, i))//[j,i]是不是回文
dp[i] = min(dp[i], dp[j-] + );
} printf("%d\n", dp[len]);
}
}

按照上面瞎改的代码2:20ms

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; int T;
int dp[];
char str[];
bool ispalindrome[][]; int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%s", str+); int len = strlen(str+);
memset(ispalindrome, false, sizeof(ispalindrome));
memset(dp, 0x3f, sizeof(dp)); for (int i = ; i <= len; i++)
{
for (int l = i, r = i; str[l] == str[r] && l >= && r <= len; l--, r++)
ispalindrome[l][r] = true;
for (int l = i, r = i+; str[l] == str[r] && l >= && r <= len; l--, r++)
ispalindrome[l][r] = true;
} dp[] = ;
for (int i = ; i <= len; i++)
for (int j = ; j <= i; j++)
if (ispalindrome[j][i])//[j,i]是不是回文
dp[i] = min(dp[i], dp[j-] + ); printf("%d\n", dp[len]);
}
}

UVA-11584:Partitioning by Palindromes(基础DP)的更多相关文章

  1. uva 11584 Partitioning by Palindromes 线性dp

    // uva 11584 Partitioning by Palindromes 线性dp // // 题目意思是将一个字符串划分成尽量少的回文串 // // f[i]表示前i个字符能化成最少的回文串 ...

  2. UVA - 11584 Partitioning by Palindromes[序列DP]

    UVA - 11584 Partitioning by Palindromes We say a sequence of char- acters is a palindrome if it is t ...

  3. UVa 11584 Partitioning by Palindromes【DP】

    题意:给出一个字符串,问最少能够划分成多少个回文串 dp[i]表示以第i个字母结束最少能够划分成的回文串的个数 dp[i]=min(dp[i],dp[j]+1)(如果从第j个字母到第i个字母是回文串) ...

  4. UVa 11584 Partitioning by Palindromes (简单DP)

    题意:给定一个字符串,求出它最少可分成几个回文串. 析:dp[i] 表示前 i 个字符最少可分成几个回文串,dp[i] = min{ 1 + dp[j-1] | j-i是回文}. 代码如下: #pra ...

  5. UVA 11584 "Partitioning by Palindromes"(DP+Manacher)

    传送门 •题意 •思路一 定义 dp[i] 表示 0~i 的最少划分数: 首先,用马拉车算法求解出回文半径数组: 对于第 i 个字符 si,遍历 j (0 ≤ j < i),判断以 j 为回文中 ...

  6. 区间DP UVA 11584 Partitioning by Palindromes

    题目传送门 /* 题意:给一个字符串,划分成尽量少的回文串 区间DP:状态转移方程:dp[i] = min (dp[i], dp[j-1] + 1); dp[i] 表示前i个字符划分的最少回文串, 如 ...

  7. UVA 11584 - Partitioning by Palindromes DP

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  8. UVA 11584 Partitioning by Palindromes (字符串区间dp)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  9. UVa 11584 - Partitioning by Palindromes(线性DP + 预处理)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  10. UVA - 11584 Partitioning by Palindromes(划分成回文串)(dp)

    题意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000. 分析: 1.dp[i]为字符0~i划分成的最小回文串的个数. 2.dp[j] = Min(dp[j ...

随机推荐

  1. Nginx中的惊群现象解决方法

    *什么是惊群现象?Nginx中用了什么方法来避免这种问题的发生?本篇就解决这两个问题...→_→* 惊群现象的定义与危害 在Nginx中,每一个worker进程都是由master进程fork出来的.m ...

  2. 极光API推送 (v3 版本)

    Push API v3 这是 Push API 最近的版本. 相比于 API v2 版本,v3 版本的改进为: 完全基于 https,不再提供 http 访问: 使用 HTTP Basic Authe ...

  3. 在IAR(EWARM)中移植STM32固件库

    一.移植环境说明 (1).win10系统 (2).IAR(EWARM)7.7 (3).STM32标准固件库3.5.0 http://www.st.com/content/st_com/en/produ ...

  4. 回味经典——uboot1.1.6 之 第一阶段

    转自:http://blog.csdn.net/lizuobin2/article/details/52054293 最近打算移植一个比较新的 uboot 到开发板,回想起来上一次移植 uboot1. ...

  5. 开源跨平台声波传输库:Sonic

    简介 [Sonic](https://github.com/linyehui/sonic) 是一个跨平台的声波传输库(iOS & Android),技术上类似于[chirp](http://c ...

  6. Hadoop 源代码组织结构

    Hadoop 2.X 包括 编译好的可以直接部署的文件hadoop-{VERSION}.tar.gz; 还有源代码文件hadoop-{VERSION}-src.tar.gz , 需要 Maven 编译 ...

  7. 做一名开源社区的扫地僧——从Bug report到Google Summer of Code(GSoC):从200个bug到5000美金

    今年的软件自由日(SFD),我在广州Linux用户组的线下活动上做了一个分享,主题叫做<做一名开源社区的扫地僧(上)>.我把演讲的内容重新整理扩充, 写出了文字版, 希望可以跟更多朋友分享 ...

  8. Flutter实战视频-移动电商-41.详细页_数据接口的调试

    41.详细页_数据接口的调试 建立数据模型层,我们的业务逻辑分开,然后进行后台数据的调试 生成model类 json数据: { ", "message": "s ...

  9. ASP.NET学习笔记(一)相关概念

    ASP.NET 是一个开发框架,用于通过 HTML.CSS.JavaScript 以及服务器脚本来构建网页和网站. ASP.NET 支持三种开发模式: Web Pages MVC Web Forms ...

  10. lightoj1001【简单题】

    题意: 一个人的值不能超过10: #include<stdio.h> #include<queue> #include<string.h> #include< ...