takapt0226's diary

競技プログラミングのことを書きます

SRM 566 Div2 Medium PenguinPals

解法

区間dp
dp[i][j] = [i, j]の最大マッチング

ソースコード

int n;
string c;
int dp[55][55];
int dfs(int l, int r)
{
    if (l >= r)
	return 0;
    else if (dp[l][r] != -1)
	return dp[l][r];

    int res = 0;

    for (int i = l + 1; i <= r; ++i)
	if (c[l] == c[i])
	    chmax(res, 1 + dfs(l + 1, i - 1) + dfs(i + 1, r));

    chmax(res, dfs(l + 1, r));

    return dp[l][r] = res;
}
int PenguinPals::findMaximumMatching(string colors)
{
    c = colors;
    n = colors.size();
    CL(dp, -1);

    return dfs(0, n - 1);
}