poj 2176 folding
2024-09-20 18:59:30
Description:
就是把一个字符串压尽可能的压缩
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = , INF = 1e9;
struct node{
char s[N]; //dp[i][j]的len表示区间i-j压缩后的最小长度 s表示压缩后的字串
int len;
}dp[N][N];
int n;
char s[N];
int main(){
scanf("%s", s + );
n = strlen(s + );
for(int i = ; i <= n; i++)
dp[i][i].len = , dp[i][i].s[] = s[i];
for(int l = ; l <= n; l++)
for(int i = ; i + l - <= n; i++){ //枚举区间
int j = i + l - ;
dp[i][j].len = INF;
for(int nowl = ; nowl <= l / ; nowl++){ //枚举一个区间所有可能被压缩后子串的长度
if(l % nowl != ) continue; //如果无法整除肯定不能被压缩
int st = i, ed = i + nowl;
while(s[st] == s[ed] && ed <= j) st++, ed++; //检验该串能否被压缩
if(ed > j){
int num = l / nowl; //压缩后串的数目为num
sprintf(dp[i][j].s, "%d", num); //那么该状态下最小串的开头就是num
strcat(dp[i][j].s, "(");
strcat(dp[i][j].s, dp[i][i + nowl - ].s); //把压缩后的串接起来
strcat(dp[i][j].s, ")");
dp[i][j].len = strlen(dp[i][j].s);
break;
}
}
for(int k = i; k < j; k++)
if(dp[i][j].len > dp[i][k].len + dp[k + ][j].len){ //重新扫一遍区间更新dp[i][j]
dp[i][j].len = dp[i][k].len + dp[k + ][j].len;
strcpy(dp[i][j].s, dp[i][k].s);
strcat(dp[i][j].s, dp[k + ][j].s);
}
}
puts(dp[][n].s);
return ;
}
最新文章
- x265,帧内预测代码分析
- Android 之 log
- 手机app测试之我见
- (重刷)HDU 1874 畅通工程续 + HDU 2544 最短路 最短路水题,dijkstra解法。
- linux 打补丁 2原理
- [LeetCode#274]H-Index
- LINQ to SQL 基础
- windows 编程 —— 子窗口 与 子窗口控件
- 【Linux】linux查看日志文件内容命令tail、cat、tac、head、echo
- Centos6.5下通过shell脚本快速安装samba服务器
- Android自定义View前传-View的三大流程-Measure
- 16-1 ECMA5与ECMA6的函数定义
- Swift5 语言指南(十二) 属性
- c 字符数组与字符串
- English trip -- VC(情景课) 7 C How much are the shose? 鞋多少钱
- Django中模型(一)
- Struts按着配置文件的加载的顺序,后面文件和前面文件相同的配置,后面的会把前面的文件的值覆盖
- MSA(微服务简介)
- RabbitMQ消息分发轮询和Message Acknowledgment
- Elasticsearch学习(1) Spring boot整合Elasticsearch