codeforces1409F Subsequences of Length Two

https://codeforces.com/contest/1409/problem/F

艹怎么这题过了500多个人我不会做啊,写了个100多行的n^3贪心预处理然后n^3dp一直在wa

最后其实设dp[i][j][k]为前i个位置,用了j次修改,有k个t[0]的最多对数,这样状态就非常好转移了

如果s[i+1]==t[0],那么要么维持他是t[0],要么吧他变成t[1]

如果s[i+1]==t[1],要么维持他是t[1],要么变成t[0]

否则,要么维持都不是,要么变t[0],要么变t[1]

变t[1]的时候答案+k,变t[0]的时候k=k+1

#include<bits/stdc++.h>
using namespace std;

const int maxl=210;

int n,m,cnt,tot,ans;
int dp[maxl][maxl][maxl];
char s[maxl],ss[maxl],t[2];

inline void upd(int &a,int b)
{
	a=max(a,b);
}

inline void prework()
{
	scanf("%d%d",&n,&m);
	scanf("%s",s+1);
	scanf("%s",t);
}

inline void mainwork()
{
	ans=0;
	if(t[0]==t[1])
	{
		int cnta=0;
		for(int i=1;i<=n;i++)
		if(s[i]==t[0])
			cnta++;
		int mx=min(n,cnta+m);
		ans=mx*(mx-1)/2;
		return;
	}
	memset(dp,-1,sizeof(dp));
	dp[0][0][0]=0;
	for(int i=0;i<n;i++)
		for(int j=0;j<=m;j++)
			for(int k=0;k<=n;k++)
			if(dp[i][j][k]>=0)
			{
				if(s[i+1]==t[0])
				{
					upd(dp[i+1][j][k+1],dp[i][j][k]);
					upd(dp[i+1][j+1][k],dp[i][j][k]+k);
				}
				else if(s[i+1]==t[1])
				{
					upd(dp[i+1][j][k],dp[i][j][k]+k);
					upd(dp[i+1][j+1][k+1],dp[i][j][k]);
				}
				else
				{
					upd(dp[i+1][j][k],dp[i][j][k]);
					upd(dp[i+1][j+1][k],dp[i][j][k]+k);
					upd(dp[i+1][j+1][k+1],dp[i][j][k]);
				}
			} 
	for(int j=0;j<=m;j++)
		for(int k=0;k<=n;k++)
			upd(ans,dp[n][j][k]);
}

inline void print()
{
	printf("%d",ans);
}

int main()
{
	prework();
	mainwork();
	print();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/liufengwei1/article/details/108414479