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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章