博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
回文串+回溯法 URAL 1635 Mnemonics and Palindromes
阅读量:6216 次
发布时间:2019-06-21

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

 

1 /* 2     题意:给出一个长为n的仅由小写英文字母组成的字符串,求它的回文串划分的元素的最小个数,并按顺序输出此划分方案 3     回文串+回溯:dp[i] 表示前i+1个字符(从0开始)最少需要划分的数量,最大值是i+1,即单个回文串; 4         之前设置ok[j][j+i] 判断从j到j+i的字符是否为回文串(注意两个for的顺序,为满足ok[j][j+i] = ok[j+1][j+i-1]) 5         最后枚举找到最优划分点,用pre[i]记录前一个位置,print函数 输出空格 6 */ 7 #include 
8 #include
9 #include
10 #include
11 #include
12 using namespace std;13 14 const int MAXN = 4e3 + 10;15 const int INF = 0x3f3f3f3f;16 int dp[MAXN];17 int pre[MAXN];18 bool ok[MAXN][MAXN];19 char s[MAXN];20 21 void print(int p)22 {23 if (pre[p] == -1)24 {25 for (int i=0; i<=p; ++i) printf ("%c", s[i]);26 }27 else28 {29 print (pre[p]); printf (" ");30 for (int i=pre[p]+1; i<=p; ++i) printf ("%c", s[i]);31 }32 }33 34 void work(void)35 {36 int len = strlen (s);37 38 for (int i=0; i
=0; --j)53 {54 if (ok[j+1][i])55 {56 if (dp[i] > dp[j] + 1)57 {58 dp[i] = dp[j] + 1; pre[i] = j;59 }60 }61 }62 }63 64 printf ("%d\n", dp[len-1]);65 print (len-1); puts ("");66 }67 68 int main(void) //URAL 1635 Mnemonics and Palindromes69 {70 //freopen ("P.in", "r", stdin);71 72 while (scanf ("%s", s) == 1)73 {74 memset (ok, false, sizeof (ok));75 memset (dp, 0, sizeof (dp));76 memset (pre, 0, sizeof (pre));77 78 work ();79 }80 81 return 0;82 }

 

转载于:https://www.cnblogs.com/Running-Time/p/4492493.html

你可能感兴趣的文章
Java面试006-优化篇
查看>>
使用HANDLECOLLISIONS的几个场景
查看>>
mysqlbinlog命令使用
查看>>
Algs4-1.1.35模拟投骰子
查看>>
*Algs4-1.5.6quick-union的运行时间-(未解决)
查看>>
Hadoop1 Centos伪分布式部署
查看>>
用JavaScript编写气泡
查看>>
如何使用MySQL Workbench创建数据库存储过程
查看>>
乘法逆元...Orz
查看>>
01-前端初识
查看>>
解决修改sources.list之后update NO_PUBKEY错误
查看>>
0802THINKPHP基础:入口文件、路由、页面跳转、重定向、空模块、空控制器、空方法...
查看>>
Docker技术入门与实战 第二版-学习笔记-8-网络功能network-2-相应配置
查看>>
centos6.x升级glibc-2.17
查看>>
supervisor:进程管理工具
查看>>
mysql 的 find_in_set函数使用方法
查看>>
Jquery实现菜单激活
查看>>
我真的没有这些常识
查看>>
2018-2019 20165226 Exp5 MSF基础应用
查看>>
xe2制作Manifest并添加(UAC令牌)
查看>>