题目链接传送门
这道题主要就是求最长回文子序列(LPS)的。
最长回文子序列状态转移方程:
if(a[i] == a[j])
dp[i][j] = dp[i+1][j-1] + 2;
if(a[i] != a[j])
dp[i][j] = max(dp[i][j-1],dp[i+1][j]);
这里我用表格模拟了查找“google”和“banana”两个单词的最长回文子序列。
这里是AC代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define Max(a,b) a>b?a:b
int dp[1235][1235];
char a[1235];
int LPS(char *a,int len) { //LPS 动态规划求最长回文子序列
memset(dp,0,sizeof(dp));
for(int i = len-1; i>=0; i--) {
dp[i][i] = 1;
for(int j = i+1; j<len; j++) {
if(a[i] == a[j])
dp[i][j] = dp[i+1][j-1] + 2;
else dp[i][j] = Max(dp[i+1][j],dp[i][j-1]);
}
}
return dp[0][len-1];
}
int main() {
while(~scanf("%s",a)) {
int len = strlen(a);
for(int i=0; i<len; i++) {
if(isupper(a[i])) { //判断大写字母并转小写
a[i] = tolower(a[i]);
}
}
int res = LPS(a,len); //用来接收字符串 a 的最长回文子序列。
int ans = len - res; //用字符串总长度 - 最长回文子序列长度
printf("%d\n",ans);
}
return 0;
}