UVA 11584 "Partitioning by Palindromes"(DP+Manacher)
•题意
•思路一
定义 dp[i] 表示 0~i 的最少划分数;
首先,用马拉车算法求解出回文半径数组;
对于第 i 个字符 si,遍历 j (0 ≤ j < i),判断以 j 为回文中心的最大回文串是否包含 si;
如果包含,dp[ i ]=min{dp[ i ],dp[2*j-i-1]+1};
•Code
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+; char t[maxn];
int r[maxn<<]; struct Manacher
{
char s[maxn<<];
void Init(char *ss,int len)
{
int index=;
s[index++]='#';
for(int i=;i < len;++i)
{
s[index++]=ss[i];
s[index++]='#';
}
s[index]='\0';
}
void mana(char *ss)
{
Init(ss,strlen(ss));
int len=strlen(s);
int R=-;
int C;
for(int i=;i < len;++i)
{
r[i]=R > i ? min(R-i+,r[*C-i]):;
for(;i-r[i] >= && i+r[i] < len && s[i-r[i]] == s[i+r[i]];r[i]++);
if(i+r[i] > R)
{
R=i+r[i]-;
C=i;
}
}
}
}_mana; int dp[maxn];
int Solve()
{
_mana.mana(t); dp[]=;
int len=strlen(t);
for(int i=;i < len;++i)
{
dp[i]=dp[i-]+;
for(int j=;j <= *i;++j)
{ ///t中的第i个字符在预处理后的s数组中的位置为2*i+1
///因为可能由偶回文的情况,所以需要用到'#'
///直接判断在s数组中j的对应的最大回文j+r[j]是否包含2*i+1
///如果包含,再找到2*i+1以j为中心的对称点2*j-(2*i+1)
///判断2*j-(2*i+1)对应于t中的位置的前一个位置(2*j-(2*i+1))/2-1是否在[0,len-1]范围内
///如果在,更新dp[i]
int cur=j+r[j];
int index=(*j-*i-)/-;
if(*i+ < cur)
dp[i]=min(dp[i],+(index >= ? dp[index]:));
}
}
return dp[len-];
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
int test;
scanf("%d",&test);
while(test--)
{
scanf("%s",t);
printf("%d\n",Solve());
}
return ;
}
•思路二(reference from zishu)
定义dp[ i ]表示0~i划分成的最小回文串的个数,则dp[ i ]=min{d[ j ]+1 | j ≤ i && t[ j+1,....,i ]为回文串};
•code
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+; char t[maxn];
char s[maxn<<];
bool isPal[maxn][maxn];
int dp[maxn]; void Init()///O(n^2)预处理出t[i,..,j]是否为回文串
{
int len=strlen(t);
for(int i=;i < len;++i)
for(int j=;j < len;++j)
isPal[i][j]=false;
int index=;
s[index++]='#';
for(int i=;i < len;++i)
{
s[index++]=t[i];
s[index++]='#';
}
s[index]='\0'; for(int i=;i < index;++i)
{
int r=;
while(i-r >= && i+r < index && s[i-r] == s[i+r])
{
if((i-r)&)
isPal[(i-r)/][(i+r)/]=true;
r++;
}
}
} int Solve()
{
Init();
int len=strlen(t);
dp[]=;
for(int i=;i < len;i++)
{
dp[i]=dp[i-]+;
for(int j=;j < i;++j)
if(isPal[j][i])
dp[i]=min(dp[i],+(j > ? dp[j-]:));
}
return dp[len-];
}
int main()
{
// freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
int test;
scanf("%d",&test);
while(test--)
{
scanf("%s",t);
printf("%d\n",Solve());
}
return ;
}
UVA 11584 "Partitioning by Palindromes"(DP+Manacher)的更多相关文章
- uva 11584 Partitioning by Palindromes 线性dp
// uva 11584 Partitioning by Palindromes 线性dp // // 题目意思是将一个字符串划分成尽量少的回文串 // // f[i]表示前i个字符能化成最少的回文串 ...
- 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 ...
- UVa 11584 - Partitioning by Palindromes(线性DP + 预处理)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 11584 Partitioning by Palindromes (字符串区间dp)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA - 11584 Partitioning by Palindromes(划分成回文串)(dp)
题意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000. 分析: 1.dp[i]为字符0~i划分成的最小回文串的个数. 2.dp[j] = Min(dp[j ...
- UVa 11584 Partitioning by Palindromes【DP】
题意:给出一个字符串,问最少能够划分成多少个回文串 dp[i]表示以第i个字母结束最少能够划分成的回文串的个数 dp[i]=min(dp[i],dp[j]+1)(如果从第j个字母到第i个字母是回文串) ...
- 【UVa】Partitioning by Palindromes(dp)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=27&page=sh ...
- UVa 11584 Partitioning by Palindromes (简单DP)
题意:给定一个字符串,求出它最少可分成几个回文串. 析:dp[i] 表示前 i 个字符最少可分成几个回文串,dp[i] = min{ 1 + dp[j-1] | j-i是回文}. 代码如下: #pra ...
- 区间DP UVA 11584 Partitioning by Palindromes
题目传送门 /* 题意:给一个字符串,划分成尽量少的回文串 区间DP:状态转移方程:dp[i] = min (dp[i], dp[j-1] + 1); dp[i] 表示前i个字符划分的最少回文串, 如 ...
随机推荐
- Django中blank和NULL
当我们在django中添加一个数据库字段时,我们通常会写models.CharField(max_length = 100,null = True,blank = True).用ForeignKey, ...
- jquery 回车提交事件
$("body").keydown(function(){ if(event.keyCode == "13"){ //13是回车键的位置 } })
- Leetcode771.Jewels and Stones宝石与石头
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石. J 中的字母不重复,J 和 S中的所有字符都是字母 ...
- Eclipse中提示 找不到类 javax.servlet.http.HttpServletResponse
问题如题, 解决方案如下: 复制tomcat的安装路径下\lib\servlet-api.jar 到WEB-INF/lib下即可.
- Python学习之路5☞文件处理
一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 正趣果上果 Interesting fruit fruit 词:郭婞 曲:陈粒 编曲/混音/和声:燕池 萧: ...
- React Native等比放大不丢失图片
9月11号 0.33版本,resizeMode中添加了center, 可以实现一样的功能.不过希望这篇文章还能帮助大家. 之前我们学习了从零学React Native之08Image组件 大家可以发现 ...
- sql —— order by
用于对结果集进行排序. 原表: 根据成绩这列数据进行升序排序: 根据成绩这列数据进行降序排序:
- shell awk杂项
awk '{ ;++i<=NF;){ a[i]=a[i]?a[i]",'\''"$i"'\''":"'\''"$i"'\'' ...
- ORA-01089: 即時シャットダウン処理中 - 操作はできません
一:当时的情景 SQL> shutdown immediate --无任何返回结果 二:问题定位过程 1.查询相关进程只有ORACLE的关键进程存在 ps -ef |grep ora_ soad ...
- React事件用法
一.事件处理函数的使用 1.1 绑定事件处理函数 1.2 使用 <HelloWorld onClick={this.handleClick}/> 大括号中指定的是this对象即当前组件引用 ...
