poj 1159 Palindrome 动态规划
2013-09-08 11:57
811 查看
lstar@ubuntu:~/ds/poj$ ./a.out < 1159_2.in.dat
2
lstar@ubuntu:~/ds/poj$ cat 1159_2.in.dat
4
Ab3A
Ab33A这种对奇数的情况也需要特殊考虑,如果以中间的3为分界,则返回2,其实最小应该是1
3L7YWY
最短匹配 3L7YWY7L3 只需要3个,且并不是以原中心点为7 Y W进行扩展的,所以自己推断的状态方程是不正确的。
记录错误状态方程如下:
以原始字符串中间拆成两个字串,求两个字串如何添加的字符,成为2个相等的字串。这种思考方式就是错误的。
最后只能参考前辈文章:
动态规划法。设字符串为S,长度为L,d[i][j]表示以第i个字符为首,第j个字符为尾的字符串构成回文最少需要添加的字符个数,i和j的初值分别为1、L。
如果S[i] == S[j],即字符串两端的字符相等,d[i][j] = d[i+1][j-1],
即d[i][j]等于去掉头尾后的字符串的d值。
如果S[i] != S[j],此时划分出两个子问题,求d[i][j-1]和d[i+1][j],它两中较小的值再加1即为d[i][j](加上的1个字符是用于和S[i]或者S[j]构成对称的)。
状态转移方程
![](http://img.blog.csdn.net/20130908115622062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NqaWF4aW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
/article/1613565.html
测试数据:
结果
2
lstar@ubuntu:~/ds/poj$ cat 1159_2.in.dat
4
Ab3A
Ab33A这种对奇数的情况也需要特殊考虑,如果以中间的3为分界,则返回2,其实最小应该是1
3L7YWY
最短匹配 3L7YWY7L3 只需要3个,且并不是以原中心点为7 Y W进行扩展的,所以自己推断的状态方程是不正确的。
记录错误状态方程如下:
以原始字符串中间拆成两个字串,求两个字串如何添加的字符,成为2个相等的字串。这种思考方式就是错误的。
最后只能参考前辈文章:
动态规划法。设字符串为S,长度为L,d[i][j]表示以第i个字符为首,第j个字符为尾的字符串构成回文最少需要添加的字符个数,i和j的初值分别为1、L。
如果S[i] == S[j],即字符串两端的字符相等,d[i][j] = d[i+1][j-1],
即d[i][j]等于去掉头尾后的字符串的d值。
如果S[i] != S[j],此时划分出两个子问题,求d[i][j-1]和d[i+1][j],它两中较小的值再加1即为d[i][j](加上的1个字符是用于和S[i]或者S[j]构成对称的)。
状态转移方程
/article/1613565.html
#include <iostream> #include <stdio.h> #include <cstring> using namespace std; #define MAX_N (5000+1) char Old[MAX_N]; unsigned short dp[MAX_N][MAX_N]; //dp[i][j] 是字符以i为首j为尾构成回文字符串的最小长度,i,j初始值为1,L #define printf // #define inf 200000000 int main() { int n; while(cin>>n) { int minp = inf; for(int i=1;i<=n;i++) cin>>Old[i]; //长度为0初始化i==j的情况 for(int i=1;i<=n;i++) { dp[i][i]=0; } //长度为1,初始化i+1=j的情况 for(int i=1;i<n;i++) { int j= i +1; if(Old[i] == Old[j]) dp[i][j] =0; else dp[i][j] =1; } //长度为2到n-1的情况 for(int k=2;k<n;k++) { for(int j=k+1;j<=n;j++) { int i=j-k; if( Old[i] == Old[j] ) dp[i][j] = dp[i+1][j-1]; else dp[i][j] = min(dp[i+1][j],dp[i][j-1])+1; } } minp = dp[1] ; cout<<minp<<endl; } }
测试数据:
6 yvrqDQ 6 KOw5OF 6 fvHWds 6 RbKh3c 6 ATaOfA 6 9ycl9f 6 3aukVO 6 tqFlVf 6 6tZ8xT 6 XjW7no 6 iXXTpu 6 qj83Jl 6 X6FmjS 6 sw4W5R 6 2rtd7F 6 NnbkTF 6 D8h2iH 6 n6QzoR 6 EX3TNP 6 9N1Z6P 6 htI96k 6 IEgazA 6 ZUCPG1 6 QbuMHm 6 aslfkq 6 2fdECC 6 EXwVpZ 6 4hjtJT 6 gdrMvh 6 8cQixk 6 XdPkCU 6 DX4WyI 6 FlVW7N 6 zjO29H 6 UDfGym 6 oJJuRH 6 ZCwv6L 6 Vdt7q3 6 2TEmGW 6 ExJWoT 6 VIZvwB 6 ZJQTqV 6 k60AL8 6 P77mR5 6 kKWmd8 6 3b0yUI 6 TnQdal 6 cLZ4BM 6 JghswV 6 nD0Gz6 6 C4Bzhs 6 kcYUOP 6 8QzYaS 6 t1s0l2 6 o0vaqo 6 ye2yFB 6 dHqw66 6 hpeWYY 6 027F8u 6 DkivLX 6 kMRyNx 6 3W9oFw 6 dFckby 6 5iWypN 6 sFxYrj 6 xXx4CL 6 aZxa3L 6 HeoVfl 6 HiAiwA 6 dzTHlP 6 KKINpL 6 YoRLST 6 iglhFe 6 3UvOHd 6 EuIfbf 6 8nxVKO 6 pVJ11q 6 rw5SPe 6 OFcUgT 6 MMK2wt 6 B5mc9E 6 uulqzR 6 P5zgau 6 p3fJjF 6 6CEgwu 6 iB4BZK 6 egRG27 6 u7ETjZ 6 9wSSoA 6 qBx3UD 6 xbvEfP 6 32WqJU 6 xQYVPG 6 JqrWsQ 6 0kpLFo 6 wCxf70 6 2G5aAi 6 DW8Z6r 6 P79OyG 6 3L7YwY
结果
5 3 5 5 3 3 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5 3 3 4 4 5 5 5 5 5 5 5 3 3 5 3 5 4 5 5 5 3 5 4 5 5 4 5 4 5 5 5 3 5 5 4 5 5 5 5 5 5 5 5 5 5 3
相关文章推荐
- POJ-1159-Palindrome-回文-动态规划
- poj1159 palindrome(动态规划+滚动数组)
- poj 1159 Palindrome -- 回文串,动态规划
- 【动态规划】【poj 1159】palindrome
- POJ1159 Palindrome 【动态规划】
- 动态规划——Poj 1159 Palindrome
- 【原】 POJ 1159 Palindrome 回文 动态规划 解题报告
- poj1159 palindrome(动态规划+滚动数组)
- POJ1159 Palindrome (动态规划)
- Poj1159 Palindrome(动态规划DP求最大公共子序列LCS)
- 动态规划——Poj 1159 Palindrome
- poj 1159 Palindrome - 动态规划
- Poj1159 Palindrome(动态规划DP求最大公共子序列LCS)
- POJ 1159 Palindrome (动态规划)
- Poj1159 Palindrome(动态规划DP求最大公共子序列LCS)
- poj 1159 Palindrome 动态规划的三种解法
- 【动态规划】【poj 1159】palindrome
- POJ - 1159 Palindrome 最长公共子序列
- POJ 1159-Palindrome(DP)
- poj 1159 Palindrome(dp+滚动数组)