Problem Address:http://poj.org/problem?id=1159
事实上是一道LCS,不过做了一点点修改而已。
算是第一次打LCS,不过居然一次AC了,而且各种数据都还不赖。
时间上虽然不是最好。
思路就是将字符串反转过来,找出前后两个字符串的LCS,将字符串的长度减去LCS的值就得到答案。
原来的LCS需要n*n的空间存储数据,由于不需要记录路径,所以我直接改成两个一维数组记录,节省了大量空间。
搜了一下看到有人MLE的,庆幸= =
以下贴代码:
#include <iostream>using namespace std;int main(){ char s[5005],t[5005]; int d[5005],p[5005],n,i,j; scanf("%d", &n); scanf("%s", s); for (i=n-1,j=0; i>=0; i--,j++) { t[j] = s[i]; } for (i=0; i<n; i++) { d[i]=0; p[i]=0; } for (i=0; i<n; i++) { if (i%2==0) { if (t[i]==s[0]) d[0]=1>p[0]?1:p[0]; else d[0]=p[0]; for (j=1; j<n; j++) { if (t[i]==s[j]) { d[j] = p[j-1]+1>p[j]?p[j-1]+1:p[j]; } else { d[j] = d[j-1]>p[j]?d[j-1]:p[j];//这里可能是错的,可能是d[j]=0 } } } else { if (t[i]==s[0]) p[0]=1>d[0]?1:d[0]; else p[0]=d[0]; for (j=1; j<n; j++) { if (t[i]==s[j]) { p[j] = d[j-1]+1>d[j]?d[j-1]+1:d[j]; } else { p[j] = p[j-1]>d[j]?p[j-1]:d[j];//这里可能是错的,可能是p[j]=0 } } } } printf("%d/n", n-(d[n-1]>p[n-1]?d[n-1]:p[n-1])); return 0;}
加油加油!!!
