简要题意

给出一个长度为 \(n\) 的序列 \(A\),你需要执行下面的操作,将这个序列变成回文序列:

  • 在序列左右侧或中间插入一个元素,元素数值任意。
  • 删除一个元素。
  • 更改一个元素的值。

\(1 \le n,A_i \le 3000\)

思路

区间DP好题!

首先我们设 \(f_{i,j}\) 为区间 \([i,j]\) 变成回文序列的操作次数。

如果每一次转移的时候都重新计算,那肯定是不合适的,这里我们做一个假设,假设如果枚举到了 \([i,j]\),那么 \([x,y]\) \((i \lt x \le y \lt j)\)(子区间)已经变成了回文序列了。

那么如果 \(A_i=A_j\),那么不必进行操作,也就是 \(f_{i,j}=f_{i+1,j-1}\)。(区间 \([i,j]\) 去头去尾后得到 \([i+1,j-1]\))

如果 \(A_i \neq A_j\),那么我们一定需要操作:

  • 如果是更改元素的值,那么一定要更改 \(i\) 或者 \(j\) 的,比如 \(A_i = A_j\) 或 \(A_j = A_i\),这种情况就是继承以前的 \(f_{i+1,j-1}\)。
  • 如果是删除元素的值,那么也一定要删除 \(i\) 或者 \(j\)。删除 \(i\) 就是 \(f_{i+1,j}\),删除 \(j\) 就是 \(f_{i,j-1}\)(谁被删除了就删掉谁)

另外还要记住,执行了操作操作次数就要加上 \(1\)。

至此,我们已经推出了状态转移方程,整理如下:

\[f_{i,j}=\left\{
\begin{aligned}
& f_{i+1,j-1} (A_i = A_j) \\
& \min(f_{i+1,j-1},f_{i+1,j},f_{i,j-1})+1 (A_i \neq A_j)
\end{aligned}
\right.
\]

最后我们来讨论一下如何做到一开始我们的假设。我怕们可以枚举区间长度 \(L\),再枚举区间左端点 \(i\),这样 \(j=i+L-1\),子区间的长度必定小于 \(L\),假设得到满足。

该算法时间复杂度 \(O(n^{2})\),可以通过本题。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std; int n;
int a[3005],f[3005][3005]; inline int min(int x,int y,int z){
return min(x,min(y,z));
} signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int length=2;length<=n;length++){
for(int l=1,r=l+length-1;l<=n&&r<=n;l++,r++){
if(a[l]==a[r]){
f[l][r]=f[l+1][r-1];
}
else{
f[l][r]=min(f[l+1][r-1],f[l+1][r],f[l][r-1])+1;
}
}
}
cout<<f[1][n];
return 0;
}

AC Record

题解P3847 [TJOI2007]调整队形的更多相关文章

  1. 洛谷P3847 [TJOI2007]调整队形

    P3847 [TJOI2007]调整队形 题目背景 学校艺术节上,规定合唱队要参加比赛,各个队员的衣服颜色不能很混乱:合唱队员应排成一横排,且衣服颜色必须是左右对称的. 例如:“红蓝绿蓝红”或“红蓝绿 ...

  2. [TJOI2007] 调整队形

    题目链接 区间 DP 的经典模型之一. 题意是将整个串通过四种操作变成一个回文串,根据套路,不难设计出 dp[i][j] 表示为使区间 [i, j] 成为回文串的最少操作次数. 先判断 a[i] 是否 ...

  3. 【Luogu】P3847调整队形(DP)

    题目链接 DP果真是考思维啊 增加一个数的操作等价于删掉那个不和谐的数的操作. 所以1.2操作可以忽略. 剩下3.4操作,则可以设计f[i][j]是将区间[i,j]变成回文序列需要的操作数. if(a ...

  4. NC207040 丢手绢

    NC207040 丢手绢 题目 题目描述 "丢丢丢手绢,轻轻地放在小朋友的后面,大家不要告诉她,快点快点抓住她,快点快点抓住她." 牛客幼儿园的小朋友们围成了一个圆圈准备玩丢手绢的 ...

  5. 经典DP模型--回文词--IOI2000

    [问题描述]回文词是一种对称的字符串--也就是说, 一个回文词, 从左到右读和从右到左读得到的结果是一样的. 任意给定一个字符串, 通过插入若干字符, 都可以变成一个回文词. 你的任务是写一个程序, ...

  6. RMQ——[USACO Jan07] 均衡队形题解

    题目:[USACO Jan07] 均衡队形 描述: 题目描述 农夫约翰的 N (1 ≤ N ≤ 50,000) 头奶牛,每天挤奶时总会按同样的顺序站好.一日,农夫约翰决定为奶牛们举行一个“终极飞盘”比 ...

  7. 洛谷p1091合唱队形题解

    题目 合唱队形首先要满足的是从1这个位置到中间任意的位置为单增的,从中间任意的位置到最后是单减的,且长度最长.这样才能满足出列的同学最少. 如果要满足这个条件那么我们可以先预处理出每个点的从前找的最长 ...

  8. P1091 合唱队形题解(洛谷,动态规划LIS,单调队列)

    先上题目 P1091 合唱队形(点击打开题目) 题目解读: 1.由T1​<...<Ti​和Ti​>Ti+1​>…>TK​可以看出这题涉及最长上升子序列和最长下降子序列 2 ...

  9. 【题解】合唱队形——LIS坑爹的二分优化

     题目 [题目描述]N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形.合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1 ...

  10. [TJOI2007]书架 题解

    文中给了你一些句子,以及让你任意插入某个位置以及查询某个位置的句子. 发现因为是句子很难搞,所以开个 map 离散一下成数字.然后在额外开一个 map 记录这个数字对应的句子. 然后你要写一种支持插入 ...

随机推荐

  1. 深入剖析Sgementation fault原理

    深入剖析Sgementation fault原理 前言 我们在日常的编程当中,我们很容易遇到的一个程序崩溃的错误就是segmentation fault,在本篇文章当中将主要分析段错误发生的原因! S ...

  2. 分享个好东西 - 两行前端代码搞定bilibili链接转视频

    只需要在您的要解析B站视频的页面的</body>前面加上下面两行代码即可,脚本会在客户端浏览器里解析container所匹配到的容器里的B站超链接 (如果不是外围有a标签的超链接只是纯粹的 ...

  3. 齐博x1更新了 提供一个部分用户期待已久的功能,修改主题后变为待审

    如下图所示,你可以设置哪些用户组修改主题后,就会把原来已审核通过的主题,变为未审核.适合所有频道.

  4. 微信小程序之顶部导航栏

    wxml: <!--导航条--><view class="navbar"> <text wx:for="{{navbar}}" d ...

  5. docker-compose编排启动LNMP

    2-1.docker-compose启动php #生成php镜像  [root@rocky8 data]#vim /data/dockerfile/ubuntu_php/Dockerfile  FRO ...

  6. OpenFOAM 编程 | 求解捕食者与被捕食者模型(predator-prey model)问题(ODEs)

    0. 写在前面 本文问题参考自文献 \(^{[1]}\) 第一章例 6,并假设了一些条件,基于 OpenFOAM-v2206 编写程序数值上求解该问题.笔者之前也写过基于 OpenFOAM 求解偏分方 ...

  7. 微信小程序的学习(一)

    一.小程序简介 1.小程序与普通网页开发的区别 运行环境不同 网页运行在浏览器环境中 小程序运行在微信环境中 API不同 小程序无法调用浏览器中的DOM和BOM的API 但是小程序可以调用微信环境提供 ...

  8. Kubernetes集群YAML文件详解

    Kubernetes集群YAML文件详解 概述 k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到YAML 格式文件中,我们把这种 ...

  9. mysql如何备份

    mysqldump -h主机 -u用户名 -p密码 库名 表名 >xxx.sql

  10. 2022-11-05 Acwing每日一题

    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...