洛谷P3847 [TJOI2007]调整队形

P3847 [TJOI2007]调整队形

题目背景

学校艺术节上,规定合唱队要参加比赛,各个队员的衣服颜色不能很混乱:合唱队员应排成一横排,且衣服颜色必须是左右对称的。

例如:“红蓝绿蓝红”或“红蓝绿绿蓝红”都是符合的,而“红蓝绿红”或“蓝绿蓝红”就不符合要求。

合唱队人数自然很多,仅现有的同学就可能会有3000个。老师希望将合唱队调整得符合要求,但想要调整尽量少,减少麻烦。以下任一动作认为是一次调整:

题目描述

1、在队伍左或右边加一个人(衣服颜色依要求而定);

2、在队伍中任两个人中间插入一个人(衣服颜色依要求而定);

3、剔掉一个人;

4、让一个人换衣服颜色;

老师想知道就目前的队形最少的调整次数是多少,请你编一个程序来回答他。

因为加入合唱队很热门,你可以认为人数是无限的,即随时想加一个人都能找到人。同时衣服颜色也是任意的。

输入输出格式

输入格式:

第一行是一个整数n(1<=n<=3000)。

第二行是n个整数,从左到右分别表示现有的每个队员衣服的颜色号,都是1到3000的整数。

输出格式:

一个数,即对于输入队列,要调整得符合要求,最少的调整次数。

输入输出样例

输入样例#1:

5
1 2 2 4 3

输出样例#1:

2
/*
    操作一共有四种,但是我们本着简化的原则可以发现 操作1,2 即往数列里加数可以等效的被一步操作3 即删掉 你想加数对应的那个数来代替,所以无非就两种操作:1.改变一个数。2.删掉一个数。求最少经过几步操作可以使原数列变为回文的
    我们考虑dp[i][j]表示把i…j变成回文所需的最小步数,则如果
    a[i]==a[j] 则dp[i][j]=dp[i+1][j-1]
    else
    dp[i][j]=dp[i+1][j-1]+1 改变一个数
    dp[i][j]=dp[i+1][j]+1 删掉a[i]
    dp[i][j]=dp[i][j-1]+1 删掉a[j]
    取最小值即可。复杂度O(n2)
*/
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 3010
int dp[maxn][maxn],n,a[maxn];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    for(int len=2;len<=n;len++){
        for(int i=1;i+len-1<=n;i++){
            int j=i+len-1;
            if(a[i]==a[j])dp[i][j]=dp[i+1][j-1];
            else dp[i][j]=min(min(dp[i+1][j-1],dp[i+1][j]),dp[i][j-1])+1;
        }
    }
    printf("%d",dp[1][n]);
}
时间: 2024-12-19 23:09:50

洛谷P3847 [TJOI2007]调整队形的相关文章

P3847 [TJOI2007]调整队形 题解

原题链接 简要题意: 每次可以在数组中插入一个数(可以在两端)或删除一个数,改变一个数:求让数组成为回文数组的最小步数. 这题的蓝太假了,水 \(\text{dp}\),想到算法就可以做出. 关键还是要想到用 动态规划 啊,要是想不到这题就做不出来了. (考场上可以先用搜索,然后记忆化推导也行,但是这里就不推了) 显然考虑区间 \(\text{dp}\). 用 \(f_{i,j}\) 表示将 \(a_i\) 到 \(a_j\) 变成回文的最小步数. 那么有: \[ f_{i,j} = \begi

【洛谷P1091】合唱队形

这个题显然是个dp,前面的人选完之后就不会影响后面的状态了,满足无后效性,设dp[i][0/1]表示当前判断到第i位同学并且一定选择他,从他开始上升(0)还是下降(1) 注意有组数据是持续上升的…… #include<iostream> #include<cstring> #include<cstdio> using namespace std; int n,dp[110][2],a[110],ans; int main() { scanf("%d"

【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]

以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K). 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形. 输入输出格

洛谷P1052 过河 动态规划

洛谷P1052 过河通过观察可以发现 这个点很稀疏 dp 有很长一段距离都是没有用的,那么我们可以采用离散化的思想 把这个距离压缩,但同时还要保证 对答案没有影响 如果 s==t 这时候我们需要特判 只要判断 pos[ i ] % s == 0 就可以知道是否踩到石子 然后因为 最多青蛙一次只跳了 10 假如 s == 9 t == 10 如果两个石子间的距离大于100 我们每次也可以 一步步的慢慢调整 ,其实总共只有10个状态,%10==1 %10==2 %10==3 然后我们就可以把距离 >

洛谷P1227[JSOI2008]完美的对称

洛谷P1227[JSOI2008]完美的对称 题目描述 在峰会期间,必须使用许多保镖保卫参加会议的各国代表.代表们除了由他自己的随身保镖保护外,组委会还指派了一些其他的特工和阻击手保护他们.为了使他们的工作卓有成效,使被保卫的人的安全尽可能得到保障,保镖被分配到被保护人的各个方向. 保镖的最佳站立位置应该是这样的:被保护人应站在所有保镖的对称中心.但是,只要被保 护人一移动,保镖就很难根据要人的新位置调整位置.大多数的特工都很难对此作出实时调整. 因此,安全部长决定将该过程逆转一下,保镖先站好自

洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

洛谷题目传送门 %%%天平巨佬和山楠巨佬%%% 他们的题解 思路分析 具体思路都在两位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 首先kruskal把最小生成树弄出来,因为要求次小生成树.至于为什么次小一定只在最小的基础上改变了一条边,我也不会证......打表找规律大法好 剩下的可以有一堆数据结构来维护最大值和次大值(原理两位巨佬都讲清楚了,这里只分析一下算法的优劣) 倍增+LCA 山楠巨佬的做法,我也写了这一种.复杂度\(O(MlogM(kruscal)+MlogN(

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的