UVA11584 简单DP优化
来源:互联网 发布:debian centos 读音 编辑:程序博客网 时间:2024/04/20 13:52
题意
给出N个字符串,分别求出这N个字符串最少可以分割成多少个回文子串。
题解
设dp[i]为1-i个字符最少可以分割成的回文串个数,可得状态转移方程为dp[i]=min(dp[j]+1,dp[i])(I到J为回文串)。但是,在这种情况下,时间复杂度会达到O(N^3),所以我们需要对程序进行优化。优化方式为将从I到J是否为回文串的判断进行预处理,针对每一个字符I,判断该字符加上两边的字符,分别能组成哪些回文串。经过预处理,可将时间复杂度降低到O(N^2)。
注意事项
注意初始化dp[0]=0
代码
#include <iostream>#include<cstdio>#include<algorithm>#include<cstring>#define INF 1e9using namespace std;char ch[1010];int dp[1010];int re[1010][1010];int main(){ int n; scanf("%d",&n); while(n--) { scanf("%s",ch); int len=strlen(ch); for(int i=len;i>0;i--){ ch[i]=ch[i-1]; } ch[0]=' '; for(int i=0;i<=len;i++){ dp[i]=i; } memset(re,0,sizeof(re)); //预处理回文串 for(int i=1;i<=len;i++){ re[i][i]=1; if(ch[i-1]==ch[i+1]){ for(int j=0;j<=len;j++){ if(i-j<0||i+j>len) break; if(ch[i-j]==ch[i+j]){ re[i-j][i+j]=1; re[i+j][i-j]=1; }else{ break; } } } if(ch[i-1]==ch[i]){ for(int j=0;j<=len;j++){ if(i-j-1<0||i+j>len) break; if(ch[i-1-j]==ch[i+j]){ re[i-j-1][i+j]=1; re[i+j][i-j-1]=1; }else{ break; } } } if(ch[i]==ch[i+1]){ for(int j=0;j<=len;j++){ if(i-j<0||i+j+1>len) break; if(ch[i-j]==ch[i+j+1]){ re[i-j][i+j+1]=1; re[i+j+1][i-j]=1; }else{ break; } } } } dp[0]=0; for(int i=1;i<=len;i++){ for(int j=0;j<len;j++){ if(j<=i){ if(re[j+1][i]){ //printf("%d %d %d\n",i,j+1,dp[j]); dp[i]=min(dp[j]+1,dp[i]); } } } } printf("%d\n",dp[len]); } return 0;}
0 0
- UVA11584 简单DP优化
- dp uva11584
- uva11584(暴力DP)
- UVA11584---Partitioning by Palindromes(dp)
- uva11584
- UVA11584
- UVa11584
- uva11584 dp最少回文串划分
- uva11584 划分成回文串 线性dp
- UVA11584-Partitioning by Palindromes(dp)
- hdu1579简单的用dp优化递归
- poj 2823 简单单调队列优化dp
- [BZOJ2687]简单题(dp+bitset优化)
- re :uva11584
- Buy Tickets hoj 单调队列优化DP的简单应用
- 山东理工周赛 3 简单单调队列优化dp
- ACM简单DP—最长增子序列优化
- zoj 3349 简单DP 线段树或树状数组优化
- Java基本语法之初始化
- 坚持ing
- Android 开发 工具类小技巧
- 【JAVA-工具类】response写出json
- 使用git工具上传代码文件到github
- UVA11584 简单DP优化
- cuda线程网格
- Spring 实现数据库读写分离
- java自定义泛型(泛形)方法
- 三,iOS TextView的边界与文字距离的的修改
- 解析json工具
- 梯度下降与反向传播详解
- "尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"
- Android省电开发 浅析