#include <bits/stdc++.h>
using namespace std;
const int N=100+10;
int dp[N][N][N/2];
char str[N];
int n,m,num,p[N];
int main()
{
int Case;scanf("%d",&Case);
while (Case--){
scanf("%d%d",&n,&m);m/=2;
scanf("%s",str+1);
num=0;for (int i=1;i<=n;i++) if (str[i]=='2') p[++num]=i;
for (int i=0;i<=n;i++)for (int j=0;j<=num;j++)for (int k=0;k<=m;k++)dp[i][j][k]=-1;
dp[0][0][0]=0;
int ans=0;
for (int i=1;i<=n;i++)for (int j=1;j<=min(i,num);j++)for (int k=0;k<=m;k++)if (abs(p[j]-i)<=k){
for (int l=0;l<i;l++){
int tmp = dp[l][j-1][k-abs(p[j]-i)];
if (tmp != -1){
if (i-l>2) tmp++;
dp[i][j][k]=max(dp[i][j][k],tmp);
}
}
if (j==num) {
if (n-i>=2 && dp[i][j][k]!=-1) dp[i][j][k]++;//最后一个数 1 2 3
ans=max(dp[i][j][k],ans);
}
}
printf("%d\n",ans);
}
return 0;
}
/*
题目: http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=748&pid=1003
题意: 给定一个字符串,长度为n,只包含2,3。呃喵只有m点智力。她每次操作可以交换两个相邻的字符,代价是智力-2。问你,在使得自己智力不降为负数的条件下,呃喵最多能使这个字符串中有多少个子串"233"。
题解: dp[i][j][k]表示最后一个2在i位置,现在共放了j个2,呃喵剩下k点智力最大答案。转移:若相邻的两个2间隔大于2,则答案+1
*/
BestCoder Round #92-1003 Girls Love 233
最新推荐文章于 2021-09-07 21:08:56 发布