博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ural 1635 Mnemonics and Palindromes(DP)
阅读量:4450 次
发布时间:2019-06-07

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

题目地址:

又是输出路径的DP。。。连着做了好多个了。

状态转移还是挺简单的。要先预处理出来全部的回文串,tag[i][j]为1表示字符串i--j是一个回文串。否则不是回文串。预处理时要用n^2的方法。即枚举回文串中间。能够分奇数和偶数两种分别求一次。

然后dp转移方程为,若tag[j][i]==1,dp[i]=min(dp[i],dp[j-1]+1);

对于最令人讨厌的路径输出。能够用pre来记录回文串前驱分裂点,然后依据这些分裂点来输出。

代码例如以下:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define LL __int64const int INF=0x3f3f3f3f;char s[5000];int dp[5000], tag[4001][4001], len, pre[4001], a[4001];void init(){ int i, j, k, l, r; memset(tag,0,sizeof(tag)); for(i=0;i
=len) break; if(s[l]==s[r]) { tag[l][r]=1; } else break; } } for(i=0;i
=len) break; if(s[l]==s[r]) { tag[l][r]=1; } else break; } } }}int main(){ int i, j, k, cnt; scanf("%s",s); len=strlen(s); init(); dp[0]=0; memset(pre,-1,sizeof(pre)); for(i=1;i<=len;i++) { dp[i]=dp[i-1]+1; pre[i]=i-1; for(j=1;j
dp[j-1]+1) { dp[i]=dp[j-1]+1; pre[i]=j-1; } } } } printf("%d\n",dp[len]); cnt=0; for(i=len;i!=-1;i=pre[i]) { a[++cnt]=i; //printf("%d ",a[cnt-1]); } sort(a+1,a+cnt+1); /*for(i=1;i<=cnt;i++) { printf("%d ",a[i]); }*/ for(i=2;i<=cnt;i++) { for(j=a[i-1];j

转载于:https://www.cnblogs.com/jzssuanfa/p/6803345.html

你可能感兴趣的文章
Kiss MySQL goodbye for development and say hello to HSQLDB
查看>>
Python web多sitemap创建更新解决方案
查看>>
javase基础10
查看>>
Qt Font
查看>>
UILabel设置富文本格式显示
查看>>
[洛谷P3379]【模板】最近公共祖先(LCA)
查看>>
java程序——随机数求和
查看>>
HTML5的浏览器支持方案
查看>>
在Asp.Net MVC中使用Repeater控件
查看>>
应用程序已被安全设置阻止
查看>>
找球号(一)
查看>>
开发小计(3)
查看>>
[Codevs] 1001 舒适的路线
查看>>
Deep Learning相关
查看>>
MySQL 树形结构 根据指定节点 获取其所有父节点序列
查看>>
hdu_5773_The All-purpose Zero(LIS)
查看>>
流程控制之while循环
查看>>
JSONObject和JSONArray区别及基本用法
查看>>
java多线程例子
查看>>
目标检测网络之 YOLOv3
查看>>