BestCoder Round #92-1003 Girls Love 233

#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
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值