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


发布了74 篇原创文章 · 获赞 30 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/MustImproved/article/details/58629405
233