[AtCoder Code Festival Qual C] D - Yet Another Palindrome Partitioning DP

Prob.

给一个字符串。求一个最小的划分使得每一个子串重排后可以构成一个回文串。

Sol.

前三题太简单,后三题都不会做,难受。
把每一个字符的奇偶性压着存进 DP ,注意到 $ dp[i][S] = \min_{j < i} \\{dp[j][S], dp[j][S\oplus(2^k)] + 1\\} $。

Code

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 2e5 + 100, maxm = 1 << 26, INF = 0x3f3f3f3f;
int dp[maxm + 5];
char s[maxn];
inline int idx(char c){return c - 'a';}
int main()
{
    scanf("%s", &s);
    int len = strlen(s);
    memset(dp, INF, sizeof dp); dp[0] = 0;
    int tmp = 0;
    for(int i = 0; i < len; ++i)
    {
        tmp ^= (1 << idx(s[i]));
        for(int j = 0; j < 26; ++j) dp[tmp] = min(dp[tmp], dp[tmp^(1 << j)] + 1);
    }
    printf("%d\n", max(1, dp[tmp]));
    return 0;
}

标签: dp

添加新评论