题解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 记录这个数字对应的句子. 然后你要写一种支持插入 ...
随机推荐
- Vue中、参数传递以及重定向
1.参数传递 关键部分代码 1.参数传递 <router-link :to="{name:'information',params:{id:1}}">用户信息</ ...
- Vscode设置标签页多行显示
1.设置标签页多行展示的方法 文件–>首选项–>设置 2.勾选多行显示按钮 3.显示效果
- 齐博x1第三季《模板风格的制作》系列009-自定义区块代码
本节来说明如何自定义区块代码,不再继承上层模板,实现个性模板 上一节因为我们继承了layout布局模版,所以我们自定义的代码就无效了 如果我们继承了上层模板,那么相当于我们复制了一份上层模板的结构,也 ...
- flutter 系列之:flutter 中的幽灵offstage
目录 简介 Offstage详解 Offstage的使用 总结 简介 我们在使用flutter的过程中,有时候需要控制某些组件是否展示,一种方法是将这个组件从render tree中删除,这样这个组件 ...
- 永久解决Ubuntu下adb权限问题
在Linux环境下使用adb链接手机,经常会遇到全下问题,如下: adb: unable to connect for root: insufficient permissions for devic ...
- java学习之socket编程
0x00前言和思维导图 Socks实际上是什么:实际上是提供了精彩通信的端口,在通信之前双方都必须要创造一个端点才能通信,其实感觉socket跟计算机的三次握手有些相似,分为三个步骤: (1)服务器监 ...
- java学习之IO流
java io流有四大家族分别是: 1.InputStream(字节输入流) 2.OutputStream(字节输入出流)3.Reader(字符输入流)4.Writer(字符输出流)四个类都是抽象类 ...
- API 如何选择 REST,GraphQL还是gRPC
关于API的演进 CORBA RDA XML-RPC SOAP REST JSON-RPC ODATA GraphQL gRPC gRPC是什么?
- windows10 ftp文件夹错误
遇到问题: 解决办法: 1. cmd直接访问 ftp ip 2. 启用tftp client 从文件夹访问 注直接访问会弹出如之前报错一样的失败:ftp://ip ftp://用户:密码@ip 使用如 ...
- .net随笔——Web开发config替换到正式config appSettings
前言(废话) 查了一些资料,总体来说呢,就是坑,而且顺带吐槽下百度,一个内容被copy那么多遍还排在最前面.同一个内容我点了那么多次,淦. 正题: 实现目的:开发的时候使用system.debug.c ...