最大回文串(palindrome.cpp)题解(回文串输出路径)施工中

题目:

每次考试,奶牛都想作弊,而且他又找回了一些朋友,于是他就试一下作弊的滋味了。他是怎么作弊的呢?奶牛的朋友太强悍了,他生怕被老师发现,又害怕被其他同学偷去,于是他每次递给奶牛都是一段只含有 a , b , c , d a, b, c, d a,b,c,d的字符串,那么答案是什么呢?“答案就是该字符串内最长的回文串。”哈哈哈,奶牛瞬间就发现了这个秘密,可是,奶牛的朋友是个**狂,他每次递给奶牛的都是一些非常长的字符串,奶牛在短时间内没发找到答案,所以奶牛又找到了你,帮他找出字符串内最大的回文串。

回文串: 从左往右写和从右往左写都是一样的一段字符串。

输入:

10
abcdcdcbaa

输出:

9
abcdcdcba

题解:

10分尝试:

一开始我想把存储用动态规划的方式来做:
状态为:b[i][j]表示起点为i终点为j的最小回文串,这样的话按照计算处理就可以了,转移方程和计算数量相符,虽然简单但拿不满,因为b数组要开成10000三次方,直接让您的代码原地升天。

代码:

#include 
#include 
#include 
#include 
using namespace std;
#define maxx 1010
char s1[maxx];
char s2[maxx];
int dp[maxx][maxx], n;
string s[maxx][maxx];
int main() {
    scanf("%d", &n);
    scanf("%s", s1 + 1);
    memset(dp, 0, sizeof(dp));
    int k;
    int n = strlen(s1 + 1);
    for (int i = 1; i <= n; i++) s2[i] = s1[n - i + 1];
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++) {
            if (s1[i] == s2[j]) {//如果两头相同则加入两头的字符串
                dp[i][j] = dp[i - 1][j - 1] + 1;
                s[i][j] = s1[i] + s[i - 1][j - 1] + s2[j];
            } else {
                if (dp[i - 1][j] > dp[i][j - 1]) {//否则判断
                    dp[i][j] = dp[i - 1][j];
                    s[i][j] = s[i - 1][j];
                } else if (dp[i][j - 1] > dp[i - 1][j]) {
                    dp[i][j] = dp[i][j - 1];
                    s[i][j] = s[i][j - 1];
                } else {
                    dp[i][j] = dp[i - 1][j];
                    if (s[i - 1][j] > s[i][j - 1])
                        s[i][j] = s[i][j - 1];
                    else
                        s[i][j] = s[i - 1][j];
                }
            }
        }
    printf("%d\n", dp[n][n]);
    string s3 = s[n][n];
    int l = dp[n][n];
    if (l & 1) {
        for (int i = 0; i < (l - 1) / 2; i++) printf("%c", s3[i]);
        for (int i = (l - 1) / 2; i >= 0; i--) printf("%c", s3[i]);
    } else {
        for (int i = 0; i < l / 2; i++) printf("%c", s3[i]);
        for (int i = l / 2 - 1; i >= 0; i--) printf("%c", s3[i]);
    }
}

你可能感兴趣的:(区间DP,动态规划,动态规划)