首页 > 其他分享 >[刷题笔记] CF607B Zuma

[刷题笔记] CF607B Zuma

时间:2023-08-04 21:59:08浏览次数:52  
标签:int 区间 Zuma 消掉 CF607B include dp 刷题

Problem

貌似还是某场cf div1的B

Description

一个数组\(a\),每次可以消掉其中的一个回文串,求至少经过几次操作能消掉字符串\(s\)?

Solution

我们发现本题满足大区间包含小区间的特性,即通过小区间可以推出大区间,符合区间dp。

考虑状态转移,枚举一个区间\(l,r\),如果\(a_l=a_r\)则答案肯定是\(f_{l+1,r-1}\)也就是她前面的,因为此时\(a_l\)和\(a_r\)符合回文,不需要额外消,可以和前面\(f_{l+1,r-1}\)一起消。

剩下的就套用普通的区间dp板子即可。注意初始化\(f_{i,i}=1\),每一个数都需要一次消除。

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 1000
#define INF 0x3f3f3f3f
using namespace std;
int n;
int a[N];
int f[N][N];
int main()
{
    memset(f,INF,sizeof(f));
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) f[i][i] = 1;
    for(int len=2;len<=n;len++)
    {
        for(int l=1;l+len-1<=n&&l<=n;l++)
        {
            int r = l+len-1;
            if(a[l] == a[r]) 
            {
                if(l+1 == r) f[l][r] = 1;
                else f[l][r] = f[l+1][r-1];
            }
            for(int k=l;k<r;k++) 
            {
                f[l][r] = min(f[l][r],f[l][k]+f[k+1][r]);
            }
        }
    }
    cout<<f[1][n]<<endl;
    return 0;
}

标签:int,区间,Zuma,消掉,CF607B,include,dp,刷题
From: https://www.cnblogs.com/SXqwq/p/17607106.html

相关文章

  • [刷题笔记][算法模型总结] Luogu P1880 [NOI1995] 石子合并 || 区间dp之合并石子模型
    ProblemSolution本题还有一个弱化版,见LuoguP1775我们发现本题和弱化版唯一区别就是本题有环。我们先将弱化版的内容。EasyversionDescription弱化版是给定了好多堆石子,每相邻的两堆可以合并成一个大堆,每次合并会产生两个石头重量和的价值,最后会将若干堆石子合并为一堆。......
  • [刷题笔记] CF1132F Clear the String & [CQOI2007] 涂色
    Problem1Problem2双倍经验qwqDescription初始时数组为空,每次可以选择一个区间\(l-r\)将其赋为同一个值,赋的值可以覆盖,给定数组的目标形式,求至少经过多少次操作使得空数组变成目标形式。Solution我们发现每次选择一个区间,大区间包含小区间,小区间可以推到大区间。因此考虑区间......
  • 嵌入式面试刷题(day3)
    (文章目录)前言本篇文章我们继续讲解嵌入式面试刷题,给大家继续分享嵌入式中的面试笔试经验和技巧。一、怎么判断两个float是否相同在C语言中,可以使用以下代码来比较两个float类型的数据是否相同:#include<stdio.h>#include<math.h>intmain(){floata=1.234;......
  • 【备考实战】计算机二级Python刷题【一】
    时间报名时间:2023-8-31考试时间:2023-9-23第1题计算机完成一条指令所花费的时间称为一个A.执行时序B.存取周期C.执行速度D.指令周期参考解析参考解析:D[解析]一般把计算机完成一条指令所花费的时间称为-一个指令周期。指令周期越短,指令执行就越快。本题答案为D选项......
  • 数组双指针技巧汇总 [labuladong-刷题打卡 day2]
    https://labuladong.github.io/algo/challenge/ji-chu-tiao-zhan/day02/快慢指针26.删除有序数组中的重复项两个指针分别维护符合条件数组和待删除数组,当快指针移动时将符合条件元素插入已完成数组后即可。通过这两天对双指针的练习,可以发现很多双指针算法其实也是一种迭代算......
  • 前缀和数组技巧 [labuladong-刷题打卡 day3]
    今天是两道前缀和,主要有一维前缀和和二维前缀和,当然扩充到高维也是可以的,只不过状态转移会相对复杂些。这里直接贴一个动态规划的介绍吧:动态规划要素动态规划概念、特点、经典例题和于其它算法思想的比较前缀和其实是备忘录自底向上动态规划算法的一个典型例子,状态转移方程:一......
  • [刷题笔记] Luogu P1853 投资的最大效益
    ProblemSolution刚开始看这道题的时候不自主的想到了纪念品,但其实本题和纪念品还是有区别的。纪念品规定了每次只能买一个纪念品,而本题可以买无限个纪念品需要在原本的基础上买进卖出,钱有进有出,而本题时只有进,稳赚不赔。本题和纪念品不同的第一点决定了它时完全背包,纪念品......
  • [刷题笔记] Luogu P5662 [CSP-J2019] 纪念品
    ProblemDescription类似于炒股票,有买进有卖出,当天可以既买进又卖出无限次,现在有若干件物品,每件物品都有一个价格,每天每件物品的价格不一致,你初始有\(m\)元钱,想要通过若干次购进卖出的操作,使得\(T\)天后你手里的钱最多。要求:\(T\)天结束你手中的股票必须全部售出。Solution乍看......
  • [刷题笔记] Luogu P1466 [USACO2.2] 集合 Subset Sums
    ProblemDescription有一个长度为\(n\)的数组为\(1-n\),求有多少种选择方案使得选择数之和等于序列和的一半Solution题面翻译成这样是不是就好做了?首先,序列和的一半我们可以计算出\(n\times(n+1)\div2\div2\),显然序列和的一半只有是整数才有解,如果不是整数直接输出0即可。......
  • [刷题笔记] Luogu P2340 [USACO03FALL] Cow Exhibition G
    ProblemSolution乍看可能没有思路。我们注意到本题是牵扯到一头奶牛选or不选的问题,非常自然地想到01背包。接下来我们就尝试将本题背景转换成01背包问题。我们可以将智商转换成容量,情商转换成价值。(当然反过来也可)然后就可以套用01背包板子了:\[f_{i,j}=min(f_{i-1,j},f_{i-1......