8,303
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 105;
int dp[N][N][N], vis[N][N][N];
int n, m,casenum,casei,ans;
char s[N];
int p[N],len,cnt;
int dfs(int n, int lp, int tim) //n表示当前处理的2,lp表示上一个2的位置,tim剩余交换次数。
{
if (n > cnt) return (len - lp >= 2);
if (vis[n][lp][tim] == casei) //记忆化搜索
return dp[n][lp][tim];
int r = min(len,p[n]+tim); //保证当前范围
int l = max(lp + 1, p[n] - tim);
dp[n][lp][tim] = -1e9;
vis[n][lp][tim] = casei;
for (int i = l; i <= r; i++)
{
int temp =abs( p[n] - i);
dp[n][lp][tim] = max(dp[n][lp][tim],dfs(n+1,i,tim-temp)+(i-lp>=3)*(n>1));
}
return dp[n][lp][tim];
}
int main()
{
cin >> casenum;
for (casei = 1; casei <= casenum; casei++)
{
cin >> n >> m ;
cin>>s+1;
m /= 2;
len = n;
cnt = 0;
for (int i = 1; i < len;i++)
if (s[i] == '2') p[++cnt] = i;
if (cnt == 0)cout <<0 << endl;
else {
ans = dfs(1, 0, m);
cout << ans << endl;
}
}
return 0;
}