Codeforces 1114D(区间DP)
题面
分析
法1(区间DP):
首先,我们可以把连续的相等区间缩成一个数,用unique来实现,不影响结果
{1,2,2,3,3,3,5,3,4}->{1,2,3,5,3,4}
先从一个极端情况来考虑,a={1,2,3,4,5},此时答案显然为4,从1个点出发,先把它变成和左边的点相等,再把它变成和右边的点相等,一共需n-1次
假设我们已经把中间某个区间[i,j]变成相同颜色的一段,如{1,5,5,5,5,4}
如果a[i-1]!=a[j+1],则需要变两次,如果a[i-1]=a[j+1],只需要变一次了,
所以我们需要求出形如a[i-1]=a[j+1]的数对个数ans,由于每个这样的数对会少变一次
所以答案就是n-1-ans
那么如何求出ans呢
区间DP,\(dp[i][j]\)表示区间\([i,j]\)外的数对个数
则\(dp[i][j]=\begin{cases} max(dp[i-1][j],dp[i][j+1]) \\ max(dp[i-1][j],dp[i][j+1],dp[i-1][j+1]+1),a[i-1]=a[j+1]\end{cases}\)
初始值\(dp[1][n]\)=0
最后得到的\(dp[i][i]\)表示除了i之外的数列中的数对个数,即从i开始变需要变n-1-\(dp[i][i]\)次
取\(dp[i][i]\)的最大值即可
时间复杂度\(O(n^2)\)
法二(CF官方题解的做法):
由法一的分析,我们注意到数对会形成回文子序列
如{1,3,2,5,3,1},则1 3 2 3 1就形成了回文子序列,
显然变化次数为n-(回文子序列长度+1)/2
因此我们只要求出最长的回文子序列长度,可以把原串和反串跑LCS,时间复杂度\(O(n^2)\)
用LCS转LIS可以优化到\(O(n\log n)\)
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 5005
using namespace std;
int n;
int a[maxn];
int dp[maxn][maxn];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
n=unique(a+1,a+1+n)-a-1;
dp[1][n]=0;
for(int len=n-1;len>=1;len--){
for(int i=1;i+len-1<=n;i++){
int j=i+len-1;
dp[i][j]=max(dp[i-1][j],dp[i][j+1]);
if(i-1>=0&&j+1<=n&&a[i-1]==a[j+1]) dp[i][j]=max(dp[i][j],dp[i-1][j+1]+1);
}
}
int ans=0;
for(int i=1;i<=n;i++) ans=max(ans,dp[i][i]);
printf("%d\n",n-1-ans);
}
最新文章
- 使用jq插入节点
- ThinkCMF-幻灯片制作
- MySQL 5.6.21 最新版的安装
- LeetCode题解——Median of Two Sorted Arrays
- Codeforces 444C DZY Loves Colors(线段树)
- BZOJ 3992 序列统计
- C语言深度解剖读书笔记(6.函数的核心)
- 《Python自然语言处理》第二章 学习笔记
- 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 Bug修复
- 设计模式 | 模板方法模式(template method)
- centos7.6设置sftp服务
- Visual Studio 禁用诊断工具
- 2017.07.06【NOIP提高组】模拟赛B组
- cookie.js插件的案例
- php支付宝手机网页支付类实例
- Backbone基础笔记
- C# 调用C++DLL 类型转换
- PHP对象5: define / const /static
- Jmeter-BeanShell Sampler调用java代码
- BZOJ5293:[BJOI2018]求和(LCA,差分)
热门文章
- 使用form提交到搜狗浏览器示例
- 相对路径 分类: C# 2015-06-11 15:41 8人阅读 评论(0) 收藏
- pylint在pycharm的使用及pylint的配置
- 基本的bash shell
- 屏蔽命令任何输出的:>;/dev/null 2>;&;1
- Jumpserver安装过程
- Git--07 Gitlab备份与恢复
- 解决 linux 下安装 node 报: command not found
- LinuxMySQL主从复制原理图
- Python基础教程(019)--执行Python的方式,IPython