区间 dp 系列 题解

news2025/4/18 22:09:58

1.洛谷 P4342 IOI1998 Polygon

我的博客

2.洛谷 P4290 HAOI2008 玩具取名

题意

某人有一套玩具,并想法给玩具命名。首先他选择 W, I, N, G 四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好,将名字中任意一个字母用 W, I, N, G 中任意两个字母代替,使得自己的名字能够扩充得很长。

现在,他想请你猜猜某一个很长的名字,最初可能是由哪几个字母变形过来的。

四个整数 W , I , N , G W, I, N, G W,I,N,G,表示每一个字母能由几种两个字母所替代:

  • 接下来 W W W 行,每行两个字母,表示 W 可以用这两个字母替代。

  • 接下来 I I I 行,每行两个字母,表示 I 可以用这两个字母替代。

  • 接下来 N N N 行,每行两个字母,表示 N 可以用这两个字母替代。

  • 接下来 G G G 行,每行两个字母,表示 G 可以用这两个字母替代。

  • 最后一行一个长度不超过 L L L 的字符串。表示这个玩具的名字。

一行字符串,输出该名字可能由哪一个字母变形而得到。(按照 W, I, N, G 的顺序输出)

如果给的名字不能由任何一个字母变形而得到则输出 The name is wrong!

L ≤ 200 L \leq 200 L200 W , I , N , G ≤ 16 W, I, N, G \leq 16 W,I,N,G16

思路

其实就是原字符串中,找其中两个合并成特定的一个字母,问最后能否变成只有一个字母。合并问题,想到用区间 dp。

不妨给 4 4 4 个字母编号: W , I , N , G \rm W,I,N,G W,I,N,G 分别对应 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4。设 f i , j , x f_{i,j,x} fi,j,x 表示区间 [ i , j ] [i,j] [i,j] 的字符,是否可以合并成编号为 x x x 的字符。

考虑转化为子问题:将区间 [ i , j ] [i,j] [i,j] 拆分成 [ i , k ] [i,k] [i,k] [ k + 1 , j ] [k+1,j] [k+1,j],并且分别期望用编号为 p q , p , q pq,p,q pq,p,q 的字母来覆盖(这变量够直观吧)。

如果左右区间都可以被完全替换为期望字符,并且编号为 p q pq pq 的字母可以被两个编号分别为 p , q p,q p,q 的字母并起来替代,那么 f i , j , x = 1 f_{i,j,x}=1 fi,j,x=1

至于关系就很好处理了。我的代码是懒人写法:

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=203;
ll m[5];
string s;
bool vis[5][5][5],f[N][N][5];//f(i,j,x):区间[i,j]能否替换成字母编号x 
ll chg(char c)
{
	if(c=='W')return 1;
	if(c=='I')return 2;
	if(c=='N')return 3;
	return 4;
}
char print(ll i)
{
	if(i==1)return 'W';
	if(i==2)return 'I';
	if(i==3)return 'N';
	return 'G';
}
int main()
{
	ios::sync_with_stdio(0);
	for(int i=1;i<=4;i++)
	cin>>m[i];
	for(int i=1;i<=4;i++)
	{
		for(int j=1;j<=m[i];j++)
		{
			string t;
			cin>>t;
			vis[i][chg(t[0])][chg(t[1])]=1;
		}
	}
	cin>>s;
	ll n=s.size();
	s='*'+s;
	for(int i=1;i<=n;i++)
	f[i][i][chg(s[i])]=1;
	for(int len=2;len<=n;len++)
	{
		for(int i=1;i+len-1<=n;i++)
		{
			ll j=i+len-1;
			for(int k=i;k<j;k++)
			for(int pq=1;pq<=4;pq++)
			for(int p=1;p<=4;p++)
			for(int q=1;q<=4;q++)
			if(vis[pq][p][q]&&f[i][k][p]&&f[k+1][j][q])f[i][j][pq]=1;
		}
	}
	bool flag=0;
	for(int pq=1;pq<=4;pq++)
	{
		if(f[1][n][pq])cout<<print(pq);
		flag|=f[1][n][pq];
	}
	if(!flag)puts("The name is wrong!");
	return 0;
}

3.CF607B Zuma

题意

Genos \texttt{Genos} Genos 最近在他的手机上下载了祖玛游戏。在祖玛游戏里,存在 n n n 个一行的宝石,第 i i i 个宝石的颜色是 a i a_i ai。这个游戏的目标是尽快的消灭一行中所有的宝石。

在一秒钟, Genos \texttt{Genos} Genos 能很快的挑选出这些有颜色的宝石中的一个回文的、连续的子串,并将这个子串移除。每当一个子串被删除后,剩余的宝石将连接在一起,形成一个新的行列。

求把整个宝石串都移除的最短时间。

1 ≤ n ≤ 500 1 \le n \le 500 1n500

思路

合并就考虑区间 dp,设 f i , j f_{i,j} fi,j 表示区间 [ i , j ] [i,j] [i,j] 能否被完全消除,那么有几个明显的结论:

  • f i , i = 1 f_{i,i}=1 fi,i=1
  • f i , i + 1 = { 1 , a i = a i + 1 2 , a i ≠ a i + 1 f_{i,i+1}=\left\{\begin{matrix} 1,a_i=a_{i+1}\\ 2,a_i\neq a_{i+1} \end{matrix}\right. fi,i+1={1,ai=ai+12,ai=ai+1
  • f i , j = f i + 1 , j − 1 , a i = a j f_{i,j}=f_{i+1,j-1},a_i=a_j fi,j=fi+1,j1,ai=aj

前两点用于初始化。第三点作为特殊情况;对于朴素情况,枚举断点 k ∈ [ i , j ) k\in[i,j) k[i,j) 就好:
f i , j = min ⁡ { f i , k + f k + 1 , j } f_{i,j}=\min\{f_{i,k}+f_{k+1,j}\} fi,j=min{fi,k+fk+1,j}

只需讨论区间长度为 3 3 3 的就好了。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=502,inf=0x3f3f3f3f;
ll n,a[N];
ll f[N][N];//f(i,j):区间[i,j]全部消除的最短时间 
bool palin(ll l,ll r)
{
	for(int i=l,j=r;i<=j;i++,j--)
	if(a[i]!=a[j])return 0;
	return 1;
}
int main()
{
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++)
	{
		f[i][i]=1;
		if(a[i]==a[i+1])f[i][i+1]=1;
		else f[i][i+1]=2;
		for(int j=i+2;j<=n;j++)
		f[i][j]=inf;
	}
	for(int len=3;len<=n;len++)
	{
		for(int i=1;i+len-1<=n;i++)
		{
			ll j=i+len-1;
			if(a[i]==a[j])f[i][j]=f[i+1][j-1];
			for(int k=i;k<j;k++)
			f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
		}
	}
	printf("%lld",f[1][n]);
	return 0;
}

4.洛谷 P5189 SP6340 Zuma

这道题就是平时玩的祖玛游戏的规则了。

我的博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2332540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fay 数字人部署环境需求

D:\ai\Fay>python main.py pygame 2.6.1 (SDL 2.28.4, Python 3.11.9) Hello from the pygame community. https://www.pygame.org/contribute.html [2025-04-11 00:10:16.7][系统] 注册命令... [2025-04-11 00:10:16.8][系统] restart 重启服务 [2025-04-11 00:10:16.8][…

python:all列表

1.all列表的说明&#xff1a; 当模块中有__all__变量时&#xff0c;当使用from xxx import *时&#xff0c;只能导入这个列表中的元素。 2.具体的例子&#xff1a; 1.先创建一个模块my_mod,在列表__all__中分别写入第一次只写入test1&#xff0c;第二次写入test1、test2两个…

基于 SpringBoot 的校园论坛系统

收藏关注不迷路&#xff01;&#xff01; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮助更多…

深度学习总结(6)

随机梯度下降 给定一个可微函数&#xff0c;理论上可以用解析法找到它的最小值&#xff1a;函数的最小值就是导数为0的点&#xff0c;因此只需找到所有导数为0的点&#xff0c;然后比较函数在其中哪个点的取值最小。将这一方法应用于神经网络&#xff0c;就是用解析法求出损失…

SpringBoot实战1

SpringBoot实战1 一、开发环境&#xff0c;环境搭建-----创建项目 通过传统的Maven工程进行创建SpringBoot项目 &#xff08;1&#xff09;导入SpringBoot项目开发所需要的依赖 一个父依赖&#xff1a;&#xff08;工件ID为&#xff1a;spring-boot-starter-parent&#xf…

阿里云域名证书自动更新acme.sh

因为阿里云的免费证书只有三个月的有效期&#xff0c;每次更换都比较繁琐&#xff0c;所以找到了 acme.sh&#xff0c;还有一种 certbot 我没有去了解&#xff0c;就直接使用了 acme.sh 来更新证书&#xff0c;acme.sh 的主要特点就是&#xff1a; 支持多种 DNS 服务商自动化续…

大数据Hadoop(MapReduce)

MapReduce概述 MapReduce定义 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个Hadoop集群上…

图灵逆向——题十七-字体加密

十七题是一个很经典的字体加密案例&#xff0c;很适合新手入门~ 目录列表 过程分析代码实现 过程分析 打开开发者工具直接看请求&#xff0c;发现它请求的没有加密参数&#xff0c;以为万事大吉的你迫不及待的点击了响应&#xff0c;然后就会发现依托。。。 返回的数据中字体…

系统与网络安全------网络通信原理(5)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 传输层解析 传输层 传输层的作用 IP层提供点到点的连接传输层提供端到端的连接 端口到端口的连接&#xff08;不同端口号&#xff0c;代表不同的应用程序&#xff09; TCP协议概述 TCP&#xff08;Transm…

minio提供nfs服务

minio提供nfs服务 挂载minio为本地目录配置开机自动挂载方法1: 使用supervisor实现开机自动挂载方法2: 服务单元实现开机自动挂载minio为本地目录---失败调试 配置NFS服务端 挂载minio为本地目录 使用 Minio 作为后端存储&#xff0c;并通过 NFS 为客户端提供访问&#xff0c;…

嵌入式---加速度计

一、基本概念与定义 定义 加速度计&#xff08;Accelerometer&#xff09;是一种测量物体加速度&#xff08;线性加速度或振动加速度&#xff09;的传感器&#xff0c;可检测物体运动状态、振动幅度、倾斜角度等&#xff0c;输出与加速度成比例的电信号&#xff08;模拟或数字信…

swagger + Document

swagger 虽然有了api接口&#xff0c;对于复杂接口返回值说明&#xff0c;文档还是不能少。如果是一个人做的还简单一点&#xff0c;现在都搞前后端分离&#xff0c;谁知道你要取那个值呢

【Git】--- 多人协作实战场景

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; Git 前面我们学习了Git的所有本地仓库的相关操作:git基本操作,分支理解,版本回退,冲突解决等等。同时我们还理解了远端仓库在开发的作用以及相关操作push…

Higress: 阿里巴巴高性能云原生API网关详解

一、Higress概述 Higress是阿里巴巴开源的一款基于云原生技术构建的高性能API网关&#xff0c;专为Kubernetes和微服务架构设计。它集成了Ingress控制器、微服务网关和API网关功能于一体&#xff0c;支持多种协议和丰富的流量管理能力。 发展历程 Higress 从最初社区的 Isti…

VM——相机拍照失败

1、问题&#xff1a;相机频闪触发&#xff0c;在MVS中正常出图&#xff0c;在VM中出现拍照失败 2、解决&#xff1a; 1、首先排查网络设置&#xff08;巨帧是否设置&#xff09; 2、电脑的所有防火墙是否关闭 3、在MVS中恢复相机的设置参数为默认参数&#xff0c;删除VM中的全…

初识Redis · 简单理解Redis

目录 前言&#xff1a; 分布式系统 开源节流 认识Redis 负载均衡 缓存 微服务 前言&#xff1a; 本文只是作为Redis的一篇杂谈&#xff0c;简单理解一下Redis为什么要存在&#xff0c;以及它能做到和它不能做到的事儿&#xff0c;简单提及一下它对应的优势有什么&#…

自动驾驶时间同步

主要包含两个大的概念&#xff1a;时间系统间的时间同步与传感器数据间的时间同步 1. 时间系统间的时间同步 概念&#xff1a; 自动驾驶域控一般由多个芯片与多种类型的传感器组成&#xff0c;如&#xff1a;MCU SoC Camera Lidar Radar USS GNSS&#xff0c;其中 MCU…

项目进度延误的十大原因及应对方案

项目进度延误主要源于以下十大原因&#xff1a;目标不明确、需求频繁变更、资源配置不足或不合理、沟通不畅、风险管理不足、缺乏有效的项目监控、技术难题未及时解决、团队协作效率低下、决策链过长、外部因素影响。其中&#xff0c;需求频繁变更是导致延误的关键因素之一&…

消息队列(IPC技术)

目录 一、Linux 中主要的进程间通信方式如下&#xff1a; 二、消息队列函数 &#xff08;1&#xff09;msgget函数 功能概述 函数原型 参数解释 返回值 示例 结果 问题 (2) msgsnd函数 功能概述 函数原型 参数说明 返回值 示例 结果 &#xff08;3&#xff0…

突破焊丝虚影干扰,端子焊点缺陷检测如何实现自动化?

端子焊点作为 3C 产品中连接电路的关键环节&#xff0c;其质量优劣对产品性能有着决定性影响。然而&#xff0c;传统人工检测端子焊点不仅效率低下&#xff0c;难以满足大规模生产需求&#xff0c;而且误判率高&#xff0c;无法精准把控产品质量&#xff0c;成为企业提质增效智…