首页 > 其他分享 >Partitioning by Palindromes - UVa 11584

Partitioning by Palindromes - UVa 11584

时间:2023-05-11 21:13:17浏览次数:43  
标签:Partitioning Palindromes return int st kase UVa 回文

例题9-7 划分成回文串(Partitioning by Palindromes, UVa 11584)

#dp #线性dp #字符串回文 #T3

输入一个由小写字母组成的字符串,要求把它划分成尽量少的回文串。输出最少的个数。
如aaadbccb最少可以划分为3个:aaa,d,bccb

输入:
第一行输入一个n表示数据组数
接下来n行每行输入一个字符串s(1<=s<=1000)

输出:
输出一个数表示最少的个数

input

3
aaadbccb
ffgcc
juzi

output

3
3
4`

思路

状态表示: f[i] 是 1~i 中回文串个数
状态计算: f[i] = min(f[i], f[j] + 1 ) if i~j 是一个回文串

所以先用n^2把这个串中的所有回文字串标识出来。

bool is_palindrome(int i, int j)
{
	if(i >= j) return true;
	if(s[i] != s[j]) return false;

	if(st[i][j] == kase) return p[i][j];
	st[i][j] = kase;
	p[i][j] = is_palindrome(i+1,j-1);
	return p[i][j];
}

这里的 st 只是为了确保p数组中的值是当前数据组的情况, 正常的判断回文数也可以给st去掉然后每组数据重置一下p数组就行。建议记下来以后判断回文串除了双指针就用递归整。

代码

const int N = 1e3 + 10;
char s[N];
bool p[N][N];
int st[N][N];
int f[N];
int n, kase = 1;

int ispalind(int i, int j)
{
    if (i >= j)
        return 1;
    if (s[i] != s[j])
        return 0;

    if (st[i][j] == kase)
        return p[i][j];
    st[i][j] = kase;
    p[i][j] = ispalind(i + 1, j - 1);
    return p[i][j];
}

int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        scanf("%s", s + 1);
        n = strlen(s + 1);
        f[0] = 0;
        for (int i = 1; i <= n; i++)
        {
            f[i] = i + 1;
            for (int j = 0; j < i; j++)
                if (ispalind(j + 1, i))
                    f[i] = min(f[i], f[j] + 1);
        }
        cout << f[n] << endl;
        kase++;
    }
    return 0;
}

标签:Partitioning,Palindromes,return,int,st,kase,UVa,回文
From: https://www.cnblogs.com/edwinaze/p/17392242.html

相关文章

  • Jin Ge Jin Qu - UVa 12563
    例题9-5劲歌金曲(JinGeJinQu[h]ao,RujiaLiu'sPresent6,UVa12563)#dp#二维dp#01背包#T3如果问一个麦霸:“你在KTV里必唱的曲目有哪些?”得到的答案通常都会包含一首“神曲”:古巨基的《劲歌金曲》。为什么呢?一般来说,KTV不会在“时间到”的时候鲁莽地把正在唱的歌切掉......
  • UVA11107 Life Forms
    怎么没有正常的后缀数组二分的题解啊给定\(n\)个字符串,求出最长的,在多于\(\left\lfloor\frac{n}{2}\right\rfloor\)个字符串中出现的子串,并按照字典序从小到大输出。\(n\leq100\),\(|S|\leq1000\),根据套路可以将所有字符串连成一个,不同的字符串用特殊符号隔开,然后建出新......
  • CF1823D Unique Palindromes
    题意你要构造一个长度为\(n\)的由小写字母组成的字符串,满足给出的\(k\)个约束。其中,每个约束以\(p(x_i,c_i)\)的方式给出,表示构造的字符串长度为\(x_i\)的前缀中应包含\(c_i\)个本质不同的回文子串(单个字符也算)。\(3\len\le2\times10^5\),\(1\lek\le20\)。......
  • (UVA)Big Chocolate
    BigChocolateMohammadhasrecentlyvisited Switzerland .Asheloveshisfriendsverymuch,hedecidedtobuysomechocolateforthem,butasthisfinechocolateisveryexpensive(YouknowMohammadisalittleBITstingy!),hecouldonlyaffordbuyingone......
  • UVA 12177 First Knight
    (提醒:原题面是\(m\)行\(n\)列,这里改成了\(n\)行\(m\)列)首先很好想到设\(dp_{u,v}\)为\((u,v)\)的期望步数\(dp_{u,v}=\begin{cases}\sum_{i=1}^4dp_{u+du_i,v+dv_i}\timesp_i&(u\not=n\operatorname{or}v\not=m)\\0&(u=n\operator......
  • D. Unique Palindromes
    D.UniquePalindromesApalindromeisastringthatreadsthesamebackwardsasforwards.Forexample,thestringabcbaispalindrome,whilethestringabcaisnot.Let$p(t)$bethenumberofuniquepalindromicsubstringsofstring$t$,i.e.thenumber......
  • Gangsters UVA - 672
     一家饭店,有一扇大小会变得门,变化范围为[0,k]。每过一单位时间你可以让门的大小+1,-1,或者不变。客人会在不同的时间来吃饭,但是如果门的大小和他们希望的值不一样,他们就不会进来并且直接消失。吃饭要花钱,现在问饭店最多能赚多少钱。  F[i][j]=max(F[i-1][j]+v,F[i-1][j-1......
  • Marbles UVA - 10090
    给定两种购买物品的方案:花费c1元购买n1个物品,或者花费c2c2​元购买n2n2​个物品。方案可以无限使用,询问购买n个物品至少要多少元,若无法恰好购买到n个物品输出failed     #include<iostream>#include<algorithm>#include<cstring>#include<cmath>......
  • Hyper-drive UVA - 10542
    题意:给定一些个d维的方块,给定两点,求穿过多少方块 转化为(0,0)到(a,b)先考虑二维的 然后容斥原理#include<iostream>#include<algorithm>#include<cstring>#include<cmath>usingnamespacestd;constintN=103;#defineintlonglonginta[N],b[N],n;int......
  • Period UVA - 1371
     题意:给两个串A,B。现在把B串分为若干个部分,对每一个部分进行操作将其变为一个A串,代价为每部分操作次数的最大值求最小代价 #include<iostream>#include<algorithm>#include<cstring>usingnamespacestd;constintN=5003,M=N;#defineintlonglongconstinti......