poj 1159 Palindrome LCS

此题乍看没思路,萎缩的看了discuss,A之。不过为了复习STL,代码不是很精简,然后效率一般。思路就是求出给定串的转置串(利用vector的转置功能),对比二串的公共部分长度,输出串长减去公共长即是结果。刚开始开了个二维5003的数组,很随意的MLE乐,然后学了滚动数组,利用之,A过。放码子:

#include<iostream> #include<cstdio> #include<vector> #include<string> #include<cstring>//相当于string.h #include<algorithm> char ss[5500]; using namespace std; #define max(a,b) a>b?a:b short lcs[2][5003];//既然使用了滚动数组,int也是可以的 void dp(string a,string b) { unsigned int i,j; for(i=0;i<a.length();i++) for(j=0;j<b.length();j++) { if(a[i]==b[j]) lcs[i%2][j]=lcs[(i-1)%2][j-1]+1; else lcs[i%2][j]=max(lcs[(i-1)%2][j],lcs[i%2][j-1]); } } int main() { int i,n; vector<char>v; vector<char>::iterator it; scanf("%d",&n); string sa,sb; sb=""; scanf("%s",ss);//可怜巴巴挣点速度 for(i=0;ss[i]!='/0';i++)//跟ss[i++]还不一样! v.push_back(ss[i]); sa=ss; reverse(v.begin(),v.end()); for(it=v.begin();it!=v.end();it++) sb+=*it; memset(lcs,0,sizeof(lcs)); dp(sa,sb); printf("%d/n",n-lcs[(sa.length()-1)%2][sb.length()-1]); return false; }

然后试着写了写纯DP,未遂,debuging……

你可能感兴趣的:(String,vector,iterator)