『输出方案的区间DP』Folding

2023-10-13 12:58
文章标签 输出 dp 方案 区间 folding

本文主要是介绍『输出方案的区间DP』Folding,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem

Bill试图通过折叠其中的重复子序列来紧凑地表示从“A”到“Z”的大写字母字符序列。

例如,表示序列AAAAAAAAAABABABCCD的一种方法是10(A)2(BA)B2(C)D。他通过以下方式正式定义了折叠的字符序列以及它们的展开变换: 包含从“A”到“Z”的单个字符的序列被认为是折叠序列。展开此序列会产生单个字符本身的相同序列。 如果S和Q是折叠序列,则SQ也是折叠序列。如果S展开到S’并且Q展开到Q’,则SQ展开到S’Q’。

如果S是折叠序列,则X(S)也是折叠序列,其中X是大于1的整数的十进制表示。如果S展开到S’,则X(S)展开到S’重复X倍。

根据这个定义,很容易展开任何给定的折叠序列。但是,比尔对逆向转型更感兴趣。他希望折叠给定的序列,使得得到的折叠序列包含尽可能少的字符数。

Dolution

我们设 f [ i ] [ j ] f[i][j] f[i][j]表示 [ i , j ] [i,j] [i,j]的最小字符数,设 g [ i ] [ j ] g[i][j] g[i][j]表示 [ i , j ] [i,j] [i,j]的反感。

显然对于区间 [ i , j ] [i,j] [i,j]的答案,一定分为两部分:

  • 由子区间转移过来;即两个子区间之和.可以得到: f [ i ] [ j ] = f [ i ] [ k ] + f [ k + 1 ] [ j ] . f[i][j]=f[i][k]+f[k+1][j]. f[i][j]=f[i][k]+f[k+1][j].
    g [ i ] [ j ] = g [ i ] [ k ] + g [ k + 1 ] [ j ] g[i][j]=g[i][k]+g[k+1][j] g[i][j]=g[i][k]+g[k+1][j]
  • 单独对所有的循环节进行合并。此时暴力查找循环节即可。 f [ i ] [ j ] = n u m + 2 + m i n l e n f[i][j]=num+2+minlen f[i][j]=num+2+minlen
    num表示循环节个数,minlen表示最小循环节的长度。
  • 此时 g [ i ] [ j ] = n u m + ′ ( ′ + m i n l e n + ′ ) ′ g[i][j]=num+'('+minlen+')' g[i][j]=num+(+minlen+)

这道题对我们的启示就是DP输出反感不一定要做完以后再递归查找,当答案序列不大时可以边做边记录。

代码如下:

#include <bits/stdc++.h>using namespace std;
const int N = 200;char a[N];
string g[N][N], t[N][N];
int f[N][N], c[N][N], pre[N][N], n;int find(int l, int r)
{for (int L=1;L<=r-l+1;++L) {if ((r-l+1) % L) continue; int flag = 1;for (int i=l;i<=r-L;++i) if (a[i] ^ a[i+L]) {flag = 0;break;}if (flag == 1) return L;}return 0;
}
//寻找最小循环节 string str(int x)
{int t = 0;int s[1000];string S;while (x > 0) s[++t] = x%10, x /= 10;for (int i=t;i;--i) S += s[i]+'0';return S;
}int main(void)
{freopen("folding.in","r",stdin);freopen("folding.out","w",stdout);cin >> a+1;n = strlen(a+1);for (int i=1;i<=n;++i) {f[i][i] = 1;g[i][i] = a[i];}for (int len=2;len<=n;++len)for (int i=1;i<=n-len+1;++i){int j = i+len-1;f[i][j] = INT_MAX;for (int k=i;k<j;++k) if (g[i][k].size() + g[k+1][j].size() < f[i][j])f[i][j] = g[i][k].size() + g[k+1][j].size(),g[i][j] = g[i][k] + g[k+1][j];int len = find(i, j);if (len == 0) continue;int num = (j-i+1) / len;string S = str(num) + '(' + g[i][i+len-1] + ')';if (S.size() < f[i][j]) f[i][j] = S.size(), g[i][j] = S;} cout<<g[1][n]<<endl;return 0;
}

这篇关于『输出方案的区间DP』Folding的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/203380

相关文章

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

使用MyBatis TypeHandler实现数据加密与解密的具体方案

《使用MyBatisTypeHandler实现数据加密与解密的具体方案》在我们日常的开发工作中,经常会遇到一些敏感数据需要存储,比如用户的手机号、身份证号、银行卡号等,为了保障数据安全,我们通常会对... 目录1. 核心概念:什么是 TypeHandler?2. 实战场景3. 代码实现步骤步骤 1:定义 E

Python实现繁体转简体功能的三种方案

《Python实现繁体转简体功能的三种方案》在中文信息处理中,繁体字与简体字的转换是一个常见需求,无论是处理港澳台地区的文本数据,还是开发面向不同中文用户群体的应用,繁简转换都是不可或缺的功能,本文将... 目录前言为什么需要繁简转换?python实现方案方案一:使用opencc库方案二:使用zhconv库

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

MyBatis Plus中执行原生SQL语句方法常见方案

《MyBatisPlus中执行原生SQL语句方法常见方案》MyBatisPlus提供了多种执行原生SQL语句的方法,包括使用SqlRunner工具类、@Select注解和XML映射文件,每种方法都有... 目录 如何使用这些方法1. 使用 SqlRunner 工具类2. 使用 @Select 注解3. 使用

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S