CF1132F - Clear the String

题目链接:CodeForces / Luogu(目前 RMJ 炸了)

思路

对于消除操作,我们对其进行反向思考。我们可以理解为将一个字符串进行涂色,先涂的会被后涂的覆盖,这样就得到了 P4170 的题面。我们再根据 P4170 的思路推出动规方程:

\[\begin{aligned}f_{i,j}=&1(i=j)\\ f_{i,j}=&min(f_{i,j-1},f_{i+1,j})(i!=j,s_i=s_j)\\ f_{i,j}=&min(f_{i,j},f_{i,k}+f_{k+1,j}(i!=j,s_i!=s_j,i\le k<j)\end{aligned}\]

Code:

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define M 1145
using namespace std;
string s;
int n,f[M][M];
int main()
{
	cin.tie(0);
	cin>>n>>s;
	memset(f,INF,sizeof(f));
	for(int i=1;i<=n;++i)f[i][i]=1;
	for(int len=1;len<n;++len) 
		for(int i=1;i+len<=n;++i)
		{
			if(s[i-1]==s[i+len-1])f[i][i+len]=min(f[i+1][i+len],f[i][i+len-1]);
			else for(int j=i;j<i+len;++j)f[i][i+len]=min(f[i][i+len],f[i][j]+f[j+1][i+len]);
		}
	printf("%d",f[1][n]);
	return 0;
}
posted @ 2024-08-30 11:31  WilderStill  阅读(5)  评论(0)    收藏  举报