当前位置: 首页 > news >正文

【涂色 —— 区间dp】

题目

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 5010;
int a[N], f[N][N];int main()
{int n;cin >> n;for(int i = 1; i <= n; i++){cin >> a[i];if(a[i] == a[i-1]){i--;n--;}}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]) f[i][j] = f[i+1][j-1] + 1;else f[i][j] = min(f[i+1][j], f[i][j-1]) + 1;}}cout << f[1][n];return 0;
}

思路

预处理

将颜色相同的元素合并,更新n值

状态定义

f[i][j] 表示从第 i 个元素到第 j 个元素涂成相同颜色的方法集合

f[i][j] 的值等于集合中方案的的最小值

目标状态

f[1][n]

状态转移

首先明确扩展的过程中,联通块自然是连续的一段,而最后一步就是我们转移的讨论点、子集的划分点

1. \; when \; a[i] \neq a[j]

f[i][j] = min(f[i+1][j], \; f[i][j-1]) + 1

若端点元素颜色不同,则联通块不论是另一个端点还是非端点元素的颜色,都与最后一个端点元素颜色不同,必然要耗费一次步骤

2. \; when \; a[i] = a[j]

f[i][j] = f[i+1][j-1] + 1

若端点元素颜色相同,则多出一种情况,就是最后一次将两个端点元素同时联通。

比较以下这三个方案的表达式可知,上面这个表达式就是考虑完全后最好的方案(第三个方案的子段是前两个子段的一部分)

f[i+1][j]+1, \; f[i][j-1]+1 ,\; f[i+1][j-1] + 1


http://www.mrgr.cn/news/9863.html

相关文章:

  • nginx知识补充
  • wpf DynamicResource的ResourceKey值进行绑定
  • 基于x86 平台opencv的图像采集和seetaface6的图像质量评估功能
  • python使用ffmpeg将视频、音频合并合成(速度最快)
  • 使用 Springdoc OpenAPI 为 Spring Boot 应用程序生成 Swagger文档
  • AI图片生成网站Midjourney网页版开放注册 每用户可免费生成25张图片
  • 考试:计算机网络(01)
  • 【碎片】FastAPI 路径参数
  • Gazebo Harmonic 和 ROS2 jazzy 安装和测试
  • 备战秋招60天算法挑战,Day24
  • 开放式耳机危害大吗?6点如何挑选合适的开放式耳机!
  • 嵌入式面经篇十——驱动开发
  • 【hot100篇-python刷题记录】【搜索二维矩阵】
  • [JAVA]什么是泛型?泛型在Java中的应用
  • C#算法之二分查找
  • python实现简单中文词元化、词典构造、时序数据集封装等
  • 【Linux】第十六章 高级IO (五种IO模型+fcntl)
  • 什么是ElasticSearch的深度分页问题?如何解决?
  • NRK3301语音识别芯片在汽车内饰氛围灯上的应用方案解析
  • Vue3 获取农历(阴历)日期,并封装日历展示组件