hdu1153 dp回文
这题没想到用反串LCS,算是回顾了LCS吧
lcs最长子序列,刚开始忘了还以为是连续的子序列,额...搞了好久,现在应该不会忘了,还回顾了滚动数组,原来是上次还是不稳呀
现在求构成回文需要的min,转化为 n-原序列最大回文子序列
突然想起来好像在算法导论看到过用lcs求回文=.=
//lcs求回文 #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> #include <string> #include <stack> #include <queue> const int inf = (1<<31)-1; const int MAXN = 5e3+10; using namespace std; int dp[MAXN][2]; char s1[MAXN],s2[MAXN]; int main(){ int n; while(~scanf("%d",&n)){ scanf("%s",s1); for(int i=0;i<n;i++) s2[i] = s1[n-i-1]; // printf("%s\n",s2); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(s1[i-1]==s2[j-1]) dp[j][i%2] = dp[j-1][(i-1)%2]+1; else dp[j][i%2] = max(dp[j-1][i%2],dp[j][(i-1)%2]); } } cout<<n-dp[n][n%2]<<endl; } return 0; } //14 //aababaaaabbbba //abbbbaaaababaa //14 //abbbbaaaababaa //aababaaaabbbba
在一个谎言的国度,沉默就是英雄