uva 11151 Longest Palindrome(LCS)

题目连接:11151 - Longest Palindrome


题目大意:给出一个字符串,计算这个字符串的最长回文子串, 不同的是,它的子串可以不连续。


解题思路:刚开始把这道题当成普通的回文串来做了, 用了manachar算法, 让后一直WA, 然后才发现原来子串可以不连续, 但是其实就是求当前这个字符串和其逆序的最长公共子序列。


#include <stdio.h>
#include <string.h>
const int N = 1005;
int max(int a, int b) { return a > b ? a : b; }

char a[N], b[N];
int dp[N][N], len;

int solve() {
    memset(dp, 0, sizeof(dp));
    for (int i = 1; i <= len; i++) {
	for (int j = 1; j <= len; j++) {
	    if (a[i - 1] == b[j - 1])
		dp[i][j] = dp[i - 1][j - 1] + 1;
	    else
		dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
	}
    }
    return dp[len][len];
}

int main() {
    int cas;
    scanf("%d%*c", &cas);
    while (cas--) {
	gets(a);
	len = strlen(a);
	for (int i = 0; i < len; i++)
	    b[len - i - 1] = a[i];
	printf("%d\n", solve());
    }
}


你可能感兴趣的:(uva 11151 Longest Palindrome(LCS))