标签:
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 56756 | Accepted: 19631 |
Description
Input
Output
Sample Input
5 Ab3bd
Sample Output
2
题目大意:输出把当前字符串转换成回文串所要添加字符的最少字符
思路:最长公共子序列
普通的求最长公共子序列的方法会爆内存。滚动数组一发。
/* *********************************************** Author :PK28 Created Time :2015/8/27 13:44:52 File Name :4.cpp ************************************************ */ #include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <iomanip> #include <list> #include <deque> #include <stack> #define ull unsigned long long #define ll long long #define mod 90001 #define INF 0x3f3f3f3f #define maxn 5000+10 #define cle(a) memset(a,0,sizeof(a)) const ull inf = 1LL << 61; const double eps=1e-5; using namespace std; bool cmp(int a,int b){ return a>b; } int dp[2][maxn]; char s[maxn]; char t[maxn]; int main() { #ifndef ONLINE_JUDGE //freopen("in.txt","r",stdin); #endif //freopen("out.txt","w",stdout); int n; while(cin>>n){ cin>>s; strcpy(t,s); reverse(t,t+n); cle(dp); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ if(s[i-1]==t[j-1])dp[i%2][j]=dp[(i-1)%2][j-1]+1; else dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1]); } printf("%d\n",n-dp[n%2][n]); } return 0; }
标签:
原文地址:http://www.cnblogs.com/pk28/p/4763126.html