『输出方案的区间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

相关文章

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

利用Python实现可回滚方案的示例代码

《利用Python实现可回滚方案的示例代码》很多项目翻车不是因为不会做,而是走错了方向却没法回头,技术选型失败的风险我们都清楚,但真正能提前规划“回滚方案”的人不多,本文从实际项目出发,教你如何用Py... 目录描述题解答案(核心思路)题解代码分析第一步:抽象缓存接口第二步:实现两个版本第三步:根据 Fea