P2400 秘密文件(区间dp)

两个相邻的缩短串拼接后仍然是缩短串。

本身是周期串也可以缩短。

不难发现是区间dp。

  • 拼接缩短
  • 自身缩短

输出答案维护ans(i,j)ans(i,j)ans(i,j)数组即可

// Problem: P4302 [SCOI2003]字符串折叠
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4302
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2021-02-26 16:48:06
// --------by Herio--------#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=105,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
void Print(int *a,int n){for(int i=1;i<n;i++)printf("%d ",a[i]);printf("%d\n",a[n]);
}
char a[N];
int f[N][N],n;
string ans[N][N];
bool check(char *a,int n,int l){for(int i=l;i<n;i++)if(a[i]!=a[i%l]) return false;return true;
}
int num[N];
int main(){for(int i=1;i<10;i++) num[i]=1;for(int i=10;i<100;i++) num[i]=2;num[100]=3;while(~scanf("%s",a+1)){int n=strlen(a+1);mst(f,0x3f);for(int i=1;i<=n;i++) f[i][i]=1,ans[i][i]=a[i];for(int l=2;l<=n;l++)for(int i=1,j=l;j<=n;i++,j++){for(int k=i;k<j;k++)if(f[i][j]>f[i][k]+f[k+1][j]){f[i][j]=f[i][k]+f[k+1][j];ans[i][j]=ans[i][k]+ans[k+1][j];}for(int k=i;k<j;k++){int len=k-i+1;if(l%len) continue;if(check(a+i,l,len)&&f[i][j]>f[i][k]+2+num[l/len]){f[i][j]=f[i][k]+2+num[l/len];ans[i][j]=to_string(l/len)+"("+ans[i][k]+")";}}}cout<<ans[1][n]<<'\n';}return 0;
}

P2400 秘密文件(区间dp)相关推荐

  1. POJ 2955 Brackets (区间DP)

    题目链接:http://poj.org/problem?id=2955 Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  2. 0x53. 动态规划 - 区间DP(习题详解 × 8)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 文章目录 0x53. 动态规划 - 区间DP Problem A. 最优矩阵链乘 Problem B. ...

  3. UVA1626 括号序列 Brackets sequence(区间DP匹配括号,输出匹配方案)

    整理的算法模板合集: ACM模板 UVA1626 Brackets sequence 我们将正规括号序列定义如下: 空序列是正规括号序列. 如果 SSS 是一个正规括号序列,那么 (S) 和 [S] ...

  4. UVA10003 切木棍 Cutting Sticks(区间DP、细节)

    整理的算法模板合集: ACM模板 本题其实就是一个区间DP 的模板题,总长度为len,有n个切割点,也就是说能被切割成n+1段,所以左边界是0,有边界是n + 1,所以答案就是f[0][n + 1]. ...

  5. 【动态规划】区间DP - 最优矩阵链乘(另附POJ1651Multiplication Puzzle)

    最优矩阵链乘(动态规划) 一个n∗mn*mn∗m的矩阵由 nnn 行 mmm 列共 n∗mn*mn∗m 排列而成.两个矩阵A和B可以相乘当且仅当A的列数等于B的行数.一个nm的矩阵乘mp的矩阵,运算量 ...

  6. 【每日DP】day13、P3147 [USACO16OPEN]262144 (区间DP,2048游戏)难度⭐⭐⭐★

    P3147 [USACO16OPEN]262144 P 想到合并,自然就想到区间dp,一个被合成的数之前是一个区间,并且由两个数比它小 111 的区间合成.可麻烦的是,我们并不知道之前的两个区间长度各 ...

  7. poj1651(区间dp)

    题目连接:http://poj.org/problem?id=1651 题意:给出一组N个数,每次从中抽出一个数(第一和最后一个不能抽),该次的得分即为抽出的数与相邻两个数的乘积.直到只剩下首尾两个数 ...

  8. HDU 5115 Dire Wolf ——(区间DP)

    比赛的时候以为很难,其实就是一个区间DP= =..思路见:点我. 区间DP一定要记住先枚举区间长度啊= =~!因为区间dp都是由短的区间更新长的区间的,所以先把短的区间更新完.. 代码如下: 1 #i ...

  9. 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]

    传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...

最新文章

  1. 恭喜你发现了宝藏,编程习惯-日积月累
  2. 如何使用Python语言将测量数据曲线动起来? matplotlib转换成 GIF文件
  3. .Net Core 3.0 gRPC部署问题解决
  4. 【Spring注解驱动开发】java工作流引擎框架
  5. socket通信(5)4次挥手
  6. oracle查询用户的概要文件,Oracle用户、概要文件、权限及角色实例
  7. 深入mysql慢查询设置的详解
  8. 用python为喜欢的人写一个程序,每天发送贴心的消息
  9. 设计模式 笔记 享元模式 Flyweight
  10. java设置本机地址写在哪个类_JAVA获取指定的类型的本机MAC地址
  11. 校园网接无线路由器多账号登录
  12. php转jsp,阿里西西Html多功能代码转换器(html转js/jsp/php工具)
  13. Scratch编程与游戏:大鱼吃小鱼!
  14. 人工智能将从5大方面改变企业IT
  15. 香橙派 lite 2 使用OV5640
  16. 【计算机网络】网络通信协议
  17. C# 里面的 #region 是什么意思? (转载)
  18. Android 超好用的万能播放器——ijkplayer
  19. 除了Confluence,还有哪些好用的文档管理软件?测评
  20. 真理在缩水,还是上帝在掷骰子?

热门文章

  1. Tabulator javascript data grid数据表格控件检测已修改行数据
  2. linux下的GPU压力测试
  3. 图解-机器学习算法-支持向量机(01)
  4. 详解Linux下的串口
  5. 计算1至1000间的合数c语言,1-1000内质数
  6. android 语音交互动画,Android实现客户端语音动弹界面实例代码
  7. 河北计算机专科学校排行,河北2017计算机专业专科学校排名
  8. [ArcGIS]城市关联度分析
  9. pcb二次钻孔_PCB板钻孔工艺缺陷及排除方法
  10. 观音土和观音饼的来历