题解P3847 [TJOI2007]调整队形
简要题意
给出一个长度为 \(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\)。
至此,我们已经推出了状态转移方程,整理如下:
\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;
}
题解P3847 [TJOI2007]调整队形的更多相关文章
- 洛谷P3847 [TJOI2007]调整队形
P3847 [TJOI2007]调整队形 题目背景 学校艺术节上,规定合唱队要参加比赛,各个队员的衣服颜色不能很混乱:合唱队员应排成一横排,且衣服颜色必须是左右对称的. 例如:“红蓝绿蓝红”或“红蓝绿 ...
- [TJOI2007] 调整队形
题目链接 区间 DP 的经典模型之一. 题意是将整个串通过四种操作变成一个回文串,根据套路,不难设计出 dp[i][j] 表示为使区间 [i, j] 成为回文串的最少操作次数. 先判断 a[i] 是否 ...
- 【Luogu】P3847调整队形(DP)
题目链接 DP果真是考思维啊 增加一个数的操作等价于删掉那个不和谐的数的操作. 所以1.2操作可以忽略. 剩下3.4操作,则可以设计f[i][j]是将区间[i,j]变成回文序列需要的操作数. if(a ...
- NC207040 丢手绢
NC207040 丢手绢 题目 题目描述 "丢丢丢手绢,轻轻地放在小朋友的后面,大家不要告诉她,快点快点抓住她,快点快点抓住她." 牛客幼儿园的小朋友们围成了一个圆圈准备玩丢手绢的 ...
- 经典DP模型--回文词--IOI2000
[问题描述]回文词是一种对称的字符串--也就是说, 一个回文词, 从左到右读和从右到左读得到的结果是一样的. 任意给定一个字符串, 通过插入若干字符, 都可以变成一个回文词. 你的任务是写一个程序, ...
- RMQ——[USACO Jan07] 均衡队形题解
题目:[USACO Jan07] 均衡队形 描述: 题目描述 农夫约翰的 N (1 ≤ N ≤ 50,000) 头奶牛,每天挤奶时总会按同样的顺序站好.一日,农夫约翰决定为奶牛们举行一个“终极飞盘”比 ...
- 洛谷p1091合唱队形题解
题目 合唱队形首先要满足的是从1这个位置到中间任意的位置为单增的,从中间任意的位置到最后是单减的,且长度最长.这样才能满足出列的同学最少. 如果要满足这个条件那么我们可以先预处理出每个点的从前找的最长 ...
- P1091 合唱队形题解(洛谷,动态规划LIS,单调队列)
先上题目 P1091 合唱队形(点击打开题目) 题目解读: 1.由T1<...<Ti和Ti>Ti+1>…>TK可以看出这题涉及最长上升子序列和最长下降子序列 2 ...
- 【题解】合唱队形——LIS坑爹的二分优化
题目 [题目描述]N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形.合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1 ...
- [TJOI2007]书架 题解
文中给了你一些句子,以及让你任意插入某个位置以及查询某个位置的句子. 发现因为是句子很难搞,所以开个 map 离散一下成数字.然后在额外开一个 map 记录这个数字对应的句子. 然后你要写一种支持插入 ...
随机推荐
- commons-fileupload组件和commons-io组件的详细下载
commons-fileupload组件和commons-io组件的详细下载 1. commons-fileupload组件的下载 下载地址:http://commons.apache.org/fil ...
- WinDBG详解进程初始化dll是如何加载的
一:背景 1.讲故事 有朋友咨询个问题,他每次在调试 WinDbg 的时候,进程初始化断点之前都会有一些 dll 加载到进程中,比如下面这样: Microsoft (R) Windows Debugg ...
- springcloud组件梳理之Feign
最近刚好打算做一个springcloud系列的分享,趁此机会刚好梳理下springcloud常用组件的使用,今天先对feign做个简单介绍! feign是一个声明式的Web服务客户端,它使得发送web ...
- vue 数组更新(push【可用】,$set,slice,filter,map【都属于浅拷贝】)问题
this.$axios.post('https://....php',this.$qs.stringify({ user: 'suess' })) .then(res => { this.dat ...
- ctfshow web入门部分题目 (更新中)
CTFSHOW(WEB) web入门 给她 1 参考文档 https://blog.csdn.net/weixin_51412071/article/details/124270277 查看链接 sq ...
- 在Windows模拟器中使用LVGL8.3
引言 LVGL是一个跨平台.轻量级.易于移植的图形库.也因其支持大量特性和其易于裁剪,配置开关众多,且版本升级较快,不同版本之间存在一定的差异性,相关的使用教程有一定的滞后性,由于缺少最新版本的中文教 ...
- springBoot 过滤器去除请求参数前后空格(附源码)
背景 : 用户在前端页面中不小心输入的前后空格,为了防止因为前后空格原因引起业务异常,所以我们需要去除参数的前后空格! 如果我们手动去除参数前后空格,我们可以这样做 @GetMapping(value ...
- 数据结构学习——BST删除特定节点
BST删除特定节点 前言 一个平常的星期三晚上,一节通选课中,在老师放的视频和极寒空调的折磨之下,想着做点别的什么的我,打开了博客园.想起来做题下午数据结构课中老师最后在讲BST删除节点的操作,并且以 ...
- 分享一个你很可能不知道的Java异常实现的缺陷
前言 Java中一个大家熟知的知识点就是异常捕获,try...catch...finally组合,但是很多人不知道这里面有一个关于Java的缺陷,或者说是异常实现的一点不足之处. 我这边就通过一个很简 ...
- from表单前后端数据编码格式-Ajax发送json格式数据-Ajax发送文件-Django自带序列化组件-Ajax结合sweetalert
目录 一:前后端传输数据的编码格式(contentType) 1.研究post请求数据的编码格式 2.可以朝后端发送post请求的方式 3.前后端传输数据的编码格式 4.研究form表单 5.当for ...