题目链接

本来用区间DP,3次方的复杂度,T了,看了看题解,降维,直接二次方的复杂度可以解。然后折腾一下输出路径。。终于过了。

 #include <cstring>
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
char str[];
int dp[][];
int p[];
int pre[];
int flag[];
int main()
{
int i,len,j;
scanf("%s",str);
len = strlen(str);
for(i = ; i <= len; i ++)
{
dp[i][i] = ;
for(j = ;; j ++)
{
if(i-j+ < )break;
if(i+j >= len) break;
if(str[i-j] != str[i+j]) break;
dp[i-j][i+j] = ;
}
for(j = ;; j ++)
{
if(i-j+ < )break;
if(i+j >= len) break;
if(str[i-j+] != str[i+j]) break;
dp[i-j+][i+j] = ;
}
}
for(i = ; i < len; i ++)
p[i] = ;
p[] = ;
for(i = ; i < len; i ++)
{
if(dp[][i])
{
pre[i] = ;
p[i] = ;
}
}
for(i = ; i < len; i ++)
{
if(p[i] == ) continue;
for(j = ; j < i; j ++)
{
if(dp[j+][i])
{
if(p[i] > p[j] + )
{
pre[i] = j+;
p[i] = p[j]+;
}
}
}
}
printf("%d\n",p[len-]);
int a = pre[len-];
if(a != )
flag[a] = ;
a --;
while(p[len-] >= )
{
a = pre[a];
if(a != )
flag[a] = ;
a --;
p[len-] --;
}
for(i = ; i < len; i ++)
{
if(flag[i]) printf(" ");
printf("%c",str[i]);
}
printf("\n");
return ;
}

最新文章

  1. thinkphp一对多HAS_MANY
  2. Python之路-(Django进阶一)
  3. CentOS 安装 Dubbo 管理控制台
  4. C3P0的两种使用方法
  5. &lt;转&gt;浅析长度为0的数组
  6. 10分钟使用纯css实现完整的响应式导航菜单栏的效果
  7. android 内置视频目录
  8. Linq查询操作之投影操作
  9. 初识python面向对象
  10. Git简单使用
  11. 各大Oj平台介绍
  12. erl0007 - erlang 远程节点连接的两种方式
  13. equal 和 ==
  14. nape.geom.MarchingSquares
  15. 屌丝程序猿赚钱之道 之APP
  16. SQL - 删掉数据库
  17. java平台的常用资源
  18. hdu4758 Walk Through Squares 自动机+DP
  19. 聊聊并发-Java中的Copy-On-Write容器
  20. CMD(SA400 Command)

热门文章

  1. 几年前做家教写的C教程(之一)
  2. sdut 1465 公共因子
  3. maven 依赖查询
  4. maven 错误: 程序包org.junit不存在
  5. 实现一种快速查找Richedit中可见区域内OLE对象的方法
  6. Vue#计算属性
  7. autoprefixer
  8. 【MyEcplise hibernate tools】hibernate tools的使用以及错误
  9. POJ 2002 统计正方形 HASH
  10. Chrome DevTools的15个使用技巧【转载】