题目链接 http://acm.hust.edu.cn/vjudge/problem/19462
解题思路
把字符串翻转,与原字符串求LCS。
注意空串处理。
代码
#include<stdio.h> #include<string.h> #define MAX_LEN 1005 #define LOCAL char str[MAX_LEN], re[MAX_LEN]; int dp[MAX_LEN]; void reverStr() { int n = strlen(str); for(int i=1; i<=n; i++) re[n-i] = str[i]; re[0] = '0'; } int main() { #ifdef LOCAL freopen("data.txt", "r", stdin); freopen("ans.txt", "w", stdout); #endif int t; scanf("%d", &t); while(t--) { getchar(); char ch = getchar(); while(ch == ' ') ch = getchar(); if(ch == '\n') { printf("0\n"); ungetc(ch, stdin); continue; } else ungetc(ch, stdin); scanf("%s", &str[1]); str[0] = '0'; reverStr(); memset(dp, 0, sizeof(dp)); int n = strlen(str) - 1; int x; for(int i=1; i<=n; i++) { x = dp[0]; for(int j=1; j<=n; j++) { if(str[i] == re[j]) { int y = dp[j]; dp[j] = x + 1; x = y; } else { x = dp[j]; dp[j] = dp[j]>dp[j-1]?dp[j]:dp[j-1]; } } } printf("%d\n", dp[n]); } return 0; }