poj1159-LCS滚动数组优化。

来源:互联网 发布:网络专科可以自考本科 编辑:程序博客网 时间:2024/05/19 13:58

题目连接

题意:

 回文,就是从某一个字后面一次往回走。比如abdsdba从s开始后面的字符刚好往回走了,给你一个字符串,问你要插入至少多小个字符可以补成回文。

分析:

此题就是比较两个正序和逆序的字符的最长公共子序列。由于字符串长度达5000个。开关5000*5000二维数组,是超内存。

方法就是。利用滚动数组。

#include<stdio.h>#include<string.h>#define max(a,b) a>b?a:bint dp[2][5001];int main(){int n,i,j;char s[5001],t[5001];while(scanf("%d",&n)!=EOF){scanf("%s",s);  int ans=0;  memset(dp,0,sizeof(dp));  for(i=1;i<=n;i++)   {           for(j=1;j<=n;j++)             {              if(s[i-1]==s[n-j])               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]);              ans=max(ans,dp[i%2][j]);           }  }        printf("%d\n",n-ans);  }}