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)的主要内容,如果未能解决你的问题,请参考以下文章