回家两天,这是今天的第一道DP题,题目意思很简单,题目有个简便方法就是设原字符串是S1,该字符串的逆序是S2,用长度减去S1,S2的最长公共子序列就得到最少需要补充的字符数。注意本题目的空间比较大,小心超时,数组不要开天大。
代码:
#include<iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s1[5001],s2[5001];
int n;
short dp[5001][5001];
int main()
{
int i,j;
while(cin>>n)
{
getchar();
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
{
cin>>s1[i];
s2[n-i+1]=s1[i];
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(s1[i]==s2[j])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else
dp[i][j]=dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
}
}
printf("%d",n-dp[n][n]);
}
return 0;
}