博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2176 Folding(区间DP)
阅读量:4674 次
发布时间:2019-06-09

本文共 1314 字,大约阅读时间需要 4 分钟。

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

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

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

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

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

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

代码:

#include 
#include
#include
#include
#include
#include
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] <
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] <

  

转载于:https://www.cnblogs.com/pkgunboat/p/10338338.html

你可能感兴趣的文章
讨论记录:求大于一个时间段的最大平均积分,O(n)时间实现
查看>>
error) DENIED Redis is running in protected mode because protected mode is enabled报错
查看>>
CSS-16-margin值重叠问题
查看>>
selenium常用方法
查看>>
第二次作业
查看>>
ios 面试题
查看>>
express细节点注意
查看>>
MySQL教程(二)—— 关于在ACCESS中使用SQL语句
查看>>
实验4.1
查看>>
接口Interface
查看>>
bzoj 1651: [Usaco2006 Feb]Stall Reservations 专用牛棚【贪心+堆||差分】
查看>>
bzoj 1710: [Usaco2007 Open]Cheappal 廉价回文【区间dp】
查看>>
电商:购物车模块解决思路
查看>>
Java中的Map List Set等集合类
查看>>
大道至简阅读笔记01
查看>>
多个模块使用python logging
查看>>
Linux高级变量
查看>>
php ffmpeg
查看>>
java中== 和 .equals()的区别
查看>>
网络流学习笔记
查看>>