Palindrome
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5165 Accepted Submission(s): 1761
As an example, by inserting 2 characters, the string "Ab3bd" can be transformed into a palindrome ("dAb3bAd" or "Adb3bdA"). However, inserting fewer than 2 characters does not produce a palindrome.
5 Ab3bd
2
这里主要有一个回文串的问题。一个序列的 最长回文子序列就是它和自己逆序的最长公共子序列(LCS)。
然后因为5000太大了,开不了二维数组,所以我们可以用滚动数组,就是奇数偶数交叉记录。因为这个题只需要最后结果,所以中间过程被省去也没有问题。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[2][5010];
char ch1[5010],ch2[5010];
int main()
{
int i,j,n;
while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
scanf("%s",ch1);
for(i=0;i<n;i++)
ch2[i]=ch1[n-i-1];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(ch1[i-1]==ch2[j-1])
dp[i&1][j]=dp[(i-1)&1][j-1]+1;//用了位运算,也不知道节省的时间多不多=。=
else
dp[i&1][j]=max(dp[(i-1)&1][j],dp[i&1][j-1]);
}
}
printf("%d\n",n-dp[n&1][n]);
}
return 0;
}
386



被折叠的 条评论
为什么被折叠?



