P1136 迎接仪式(dp)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1136 迎接仪式(dp)相关的知识,希望对你有一定的参考价值。

P1136 迎接仪式(dp)

每次交换会导致一个 j j j和一个 z z z被修改(被交换),因此考虑令 d p ( i , x , y , k ) dp(i,x,y,k) dp(i,x,y,k)表示前 i i i个字符最多有 x x x j j j被修改和 y y y z z z被修改的答案。

然后就是比较简答的dp转移。

最后答案就是: m a x ( f [ n ] [ i ] [ i ] [ 0 ] , f [ n ] [ i ] [ i ] [ 1 ] ) , i ∈ [ 0 , k ] max(f[n][i][i][0],f[n][i][i][1]),i\\in [0,k] max(f[n][i][i][0],f[n][i][i][1]),i[0,k]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=505,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = 402653189,805306457,1610612741,998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define ios ios::sync_with_stdio(false),cin.tie(nullptr) 
void Print(int *a,int n)
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 

int f[N][105][105][2];
char a[N];
int main()
	int n,k;
	scanf("%d%d%s",&n,&k,a+1);
	mst(f,0xc0);
	f[0][0][0][1]=0;
	for(int i=1;i<=n;i++)
		for(int j=0;j<=k;j++)
			for(int l=0;l<=k;l++)
				if(a[i]=='z')
					f[i][j][l][1]=max(f[i-1][j][l][0]+1,f[i-1][j][l][1]);
					if(l) f[i][j][l][0]=max(f[i-1][j][l-1][0],f[i-1][j][l-1][1]);
				
				else 
					f[i][j][l][0]=max(f[i-1][j][l][0],f[i-1][j][l][1]);
					if(j) f[i][j][l][1]=max(f[i-1][j-1][l][0]+1,f[i-1][j-1][l][1]);
				
			
			int ans=0;
			rep(i,0,k) ans=max(ans,max(f[n][i][i][0],f[n][i][i][1]));
			printf("%d\\n",ans);
	return 0;


以上是关于P1136 迎接仪式(dp)的主要内容,如果未能解决你的问题,请参考以下文章

P1136 迎接仪式

洛谷P1136 迎接仪式

[luoguP1136] 迎接仪式(DP)

2021record

Vijos1616 迎接仪式

那些神奇的DP建模