题意:给你一个字符串,请把字符串压缩的尽量短,并且输出最短的方案。

例如:AAAAA可压缩为5(A), NEERCYESYESYESNEERCYESYESYES可压缩为2(NEERC3(YES))。

思路:区间DP,设dp[i][j]是把区间[l, r]内的字符压缩之后的最短长度,那么可以想到区间[l, r]可以通过两种方式转换而来:

1 :[i, j]整个区间本来就可以被压缩

2 :由2个子区间合并而来。

第二种转换是区间DP的常见操作,第一种直接暴力枚举可重叠串的长度即可。

代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
string dp[110][110], s; string _to_string(int num) {
string ans;
while(num) {
ans += num % 10 + '0';
num /= 10;
}
reverse(ans.begin(), ans.end());
return ans;
}
int main() {
int n;
while(cin >> s) {
n = s.length();
for (int i = 0; i < n; i++) {
dp[i][i] = s[i];
}
for (int len = 2; len <= n; len++) {
for (int i = 0; i < n - len + 1; i++) {
int j = i + len - 1;
dp[i][j] = s.substr(i, j - i + 1);
for (int nowl = 1; nowl <= len / 2; nowl++) {
if(len % nowl) continue;
int l = i, r = i + nowl;
while(s[l] == s[r] && r <= j) l++, r++;
if(r > j) {
int num = len / nowl;
dp[i][j] = _to_string(num);
dp[i][j] += "(";
dp[i][j] += dp[i][i + nowl - 1];
dp[i][j] += ")";
//cout<< dp[i][j] <<endl;
break;
}
}
for (int k = i; k < j; k++) {
if(dp[i][j].length() > dp[i][k].length() + dp[k + 1][j].length() || dp[i][j].length() == 0) {
dp[i][j] = dp[i][k] + dp[k + 1][j];
}
}
}
}
cout << dp[0][n - 1] <<endl;
} }

  

POJ 2176 Folding(区间DP)的更多相关文章

  1. POJ 2995 Brackets 区间DP

    POJ 2995 Brackets 区间DP 题意 大意:给你一个字符串,询问这个字符串满足要求的有多少,()和[]都是一个匹配.需要注意的是这里的匹配规则. 解题思路 区间DP,开始自己没想到是区间 ...

  2. Codeforces Gym 100002 Problem F "Folding" 区间DP

    Problem F "Folding" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/ ...

  3. POJ 1179 - Polygon - [区间DP]

    题目链接:http://poj.org/problem?id=1179 Time Limit: 1000MS Memory Limit: 10000K Description Polygon is a ...

  4. POJ 1160 经典区间dp/四边形优化

    链接http://poj.org/problem?id=1160 很好的一个题,涉及到了以前老师说过的一个题目,可惜没往那上面想. 题意,给出N个城镇的地址,他们在一条直线上,现在要选择P个城镇建立邮 ...

  5. UVA1630 Folding 区间DP

    Folding Description   Bill is trying to compactly represent sequences of capital alphabetic characte ...

  6. POJ 1390 Blocks(区间DP)

    Blocks [题目链接]Blocks [题目类型]区间DP &题意: 给定n个不同颜色的盒子,连续的相同颜色的k个盒子可以拿走,权值为k*k,求把所有盒子拿完的最大权值 &题解: 这 ...

  7. poj 2955"Brackets"(区间DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 给你一个只由 '(' , ')' , '[' , ']' 组成的字符串s[ ], ...

  8. POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 56150   Accepted: 19398 Desc ...

  9. HOJ 1936&POJ 2955 Brackets(区间DP)

    Brackets My Tags (Edit) Source : Stanford ACM Programming Contest 2004 Time limit : 1 sec Memory lim ...

随机推荐

  1. Windows 10 SDK 10.0.10069 : The installer failed. User cancelled installation. Error code: -2147023294

    注* 请先跳到文章后面的配置“操作系统的区域设置”部分,然后尝试重试安装VS,如果仍然失败,请看下面内容. 安装UAP SDK失败 Visual Studio 2015 RC Community 安装 ...

  2. 51nod 1449 贪心

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1449 1449 砝码称重 题目来源: CodeForces 基准时间限制 ...

  3. java学习笔记 --- 网络编程(网络的基础知识)

    1.网络模型: |--OSI(open stystem Interconnection开放式系统互连) |--特点: 是一种异构系统互连的分层结构:提供了控制互连系统交互规则的标准骨架:定义一种抽象结 ...

  4. 常用stl(c++)

    众所周知,c++的模板库是相当强大的. 下面我来列举一些常用的,(神奇的) //部分材料选自<算法竞赛入门经典(第2版)>(刘汝佳) 一,algorithm (算法) min(a,b)-- ...

  5. Investment(完全背包)

    个人心得:炸了炸了,这背包什么的脑阔痛. 完全背包什么鬼咯,状态正向转移与01背包正好相反. 二维数组的状态转移. 一维数组的优化,注意正向覆盖. 本题中的思想 ;y<=year;y++){ ; ...

  6. [ Laravel 5.5 文档 ] 数据库操作 —— 在 Laravel 中轻松实现分页功能

     简介 在其他框架中,分页是件非常痛苦的事,Laravel 让这件事变得简单易于上手.Laravel 的分页器与查询构建器和 Eloquent ORM 集成在一起,并开箱提供方便的.易于使用的.基于 ...

  7. mysql之 MySQL 主从基于position复制原理概述

    1 .主从复制简介MySQL 主从复制就是将一个 MySQL 实例(Master)中的数据实时复制到另一个 MySQL 实例(slave)中,而且这个复制是一个异步复制的过程.实现整个复制操作主要由三 ...

  8. BZOJ4358:permu

    浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html 题目传送门:https://lydsy.com/JudgeOnline ...

  9. bzoj 2839 集合计数 —— 二项式反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2839 设 \( f(i) \) 为至少 \( i \) 个选择,则 \( f(i) = C_ ...

  10. [转载]Python print函数用法,print 格式化输出

    使用print输出各型的 字符串 整数 浮点数 出度及精度控制 strHello = 'Hello Python' print strHello #输出结果:Hello Python #直接出字符串 ...