(dp)hdoj6017-Girls Love 233

Girls Love 233

Accepts: 30

Submissions: 218

Time Limit: 2000/1000 MS (Java/Others)

Memory Limit: 65536/65536 K (Java/Others)

问题描述

除了翘课以外,结识新的妹子也是呃喵重要的日程安排之一。
这不,呃喵又混进了一个叫做ACgirls的女生群里,来达成自己不可描述的目的。
然而,呃喵只会喵了个咪地说话,于是很容易引起注意。为了掩饰自己的真实身份,呃喵每次说话都小心翼翼。
她知道,很多女生都喜欢说"233",然而呃喵想说的话一开始就确定好了,所以她要对这句话做修改。
这句话的长度为n,语句里的字符不是‘2‘就是‘3‘。
呃喵的智力非常有限,只有m点。她每次操作可以交换两个相邻的字符,然而代价是智力-2。
现在问你,在使得自己智力不降为负数的条件下,呃喵最多能使这个字符串中有多少个子串"233"呢?
如"2333"中有一个"233","232323"中没有"233"

输入描述

第一行为一个整数T,代表数据组数。
接下来,对于每组数据——
第一行两个整数n和m,分别表示呃喵说的字符串长度 以及呃喵的智力
第二行一个字符串s,代表呃喵具体所说的话。

数据保证——
1 <= T <= 1000
对于99%的数据,1 <= n <= 10, 0 <= m <= 20
对于100%的数据,1 <= n <= 100, 0 <= m <= 100

输出描述

对于每组数据,输出一行。
该行有1个整数,表示最多可使得该字符串中有多少个"233"

输入样例

3
6 2
233323
6 1
233323
7 4
2223333

输出样例

2
1
2

  1 #include <iostream>
  2 #include<bits/stdc++.h>
  3 #include <stack>
  4 #include <queue>
  5 #include <map>
  6 #include <set>
  7 #include <cstdio>
  8 #include <cstring>
  9 #include <algorithm>
 10 #include <math.h>
 11 using namespace std;
 12 typedef long long ll;
 13 typedef unsigned long long ull;
 14 const int MAX=1e5+5;
 15 int t,n,m;//数据组数,长度,体力
 16 int pos[105];//2的位置
 17 char a[105];
 18 int ge;//2的个数
 19 int dp[105][55][105];
 20 int i,j,k,s;
 21 int lo,an;
 22 int re=-1;
 23 bool can[105][55][105];//到这种情况的可能性
 24 int main()
 25 {
 26 //    freopen("Girls Love 233_pre.in", "r", stdin); freopen("Girls Love 233_pre.out", "w", stdout);
 27     scanf("%d",&t);
 28     while(t--)
 29     {
 30         scanf("%d %d %s",&n,&m,a+1);
 31         m/=2;
 32         ge=0;
 33         for(i=1;i<=n;i++)
 34         {
 35             if(a[i]==‘2‘)
 36                 pos[++ge]=i;
 37         }
 38         if(ge==0)
 39         {
 40             printf("0\n");
 41             continue;
 42         }
 43         pos[0]=0;
 44         pos[ge+1]=n+1;
 45         for(i=0;i<=ge+1;i++)
 46             for(j=0;j<=m+1;j++)
 47                 for(k=0;k<=n+1;k++)
 48                 {dp[i][j][k]=0;can[i][j][k]=false;}
 49 //        for(i=0;i<=m+1;i++)
 50 //            for(j=0;j<=n+1;j++)
 51 //                can[0][i][j]=true;
 52         for(i=1;i<=ge;i++)
 53             can[i][0][pos[i]]=true;
 54         for(j=1;j<=m;j++)
 55         {
 56             lo=pos[1]-j;
 57             if(lo)
 58                 can[1][j][lo]=true;
 59             lo=pos[1]+j;
 60             if(lo<=n)
 61                 can[1][j][lo]=true;
 62         }
 63         for(i=2;i<=ge;i++)
 64         {
 65             for(j=0;j<=m;j++)
 66                 for(k=0;k+j<=m;k++)
 67             {
 68                 lo=pos[i]-k;
 69                 if(lo>0)
 70                 {
 71                     for(s=1;s<lo;s++)
 72                     {
 73                         if(can[i-1][j][s])
 74                         {
 75                             if(!can[i][j+k][lo])
 76                                 can[i][j+k][lo]=true;
 77                             an=dp[i-1][j][s];
 78                             if(lo-s>=3)
 79                             {
 80                                 an++;
 81                             }
 82                             dp[i][j+k][lo]=max(dp[i][j+k][lo],an);
 83                         }
 84                     }
 85                 }
 86                 lo=pos[i]+k;
 87                 if(lo+ge-i<=n)
 88                 {
 89                     for(s=1;s<lo;s++)
 90                     {
 91                         if(can[i-1][j][s])
 92                         {
 93                             if(!can[i][j+k][lo])
 94                                 can[i][j+k][lo]=true;
 95                             an=dp[i-1][j][s];
 96                             if(lo-s>=3)
 97                                 an++;
 98                             dp[i][j+k][lo]=max(dp[i][j+k][lo],an);
 99                         }
100                     }
101                 }
102             }
103         }
104         int an=-1;
105         int re;
106         for(i=0;i<=m;i++)
107         {
108             for(j=1;j<=n;j++)
109             {
110                 if(can[ge][i][j])
111                 {
112                     re=dp[ge][i][j];
113                     if(j<=n-2&&ge>0)
114                         re++;
115                     an=max(re,an);
116                 }
117             }
118         }
119         printf("%d\n",an);
120     }
121     return 0;
122     }


开学前一天,踌躇满志,去自习,本计划着做几道题,结果上午开始就一直卡在这个题目上……

10:30 开始做题
12:42 懵逼
13:40 发现2222一类的情况有问题
14:40 准备重写第三遍
15:05 准备重写第四遍
15:34 还是WA 真的有点崩溃了
15:46 通过对拍找到问题所在,终于AC了



题目本身其实也没有非常复杂,只能说是自己现在太差。没有办法,以此勉励自己吧。不抛弃,不放弃!
时间: 2024-10-16 01:42:49

(dp)hdoj6017-Girls Love 233的相关文章

hdu 5623 KK&#39;s Number(dp)

问题描述 我们可爱的KK有一个有趣的数学游戏:这个游戏需要两个人,有N\left(1\leq N\leq 5*{10}^{4} \right)N(1≤N≤5∗10?4??)个数,每次KK都会先拿数.每次可以拿任意多个数,直到NN个数被拿完.每次获得的得分为取的数中的最小值,KK和对手的策略都是尽可能使得自己的得分减去对手的得分更大.在这样的情况下,最终KK的得分减去对手的得分会是多少? 输入描述 第一行一个数T\left( 1\leq T\leq 10\right)T(1≤T≤10),表示数据组

Ural 1353 Milliard Vasya&#39;s Function(DP)

题目地址:Ural 1353 定义dp[i][j],表示当前位数为i位时,各位数和为j的个数. 对于第i位数来说,总可以看成在前i-1位后面加上一个0~9,所以状态转移方程就很容易出来了: dp[i][j]=dp[i][j]+dp[i][j-1]+dp[i][j-2]+.......+dp[i][j-9]: 最后统计即可. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <

HDU 4908 (杭电 BC #3 1002题)BestCoder Sequence(DP)

题目地址:HDU 4908 这个题是从m开始,分别往前DP和往后DP,如果比m大,就比前面+1,反之-1.这样的话,为0的点就可以与m这个数匹配成一个子串,然后左边和右边的相反数的也可以互相匹配成一个子串,然后互相的乘积最后再加上就行了.因为加入最终两边的互相匹配了,那就说明左右两边一定是偶数个,加上m就一定是奇数个,这奇数个的问题就不用担心了. 代码如下: #include <iostream> #include <stdio.h> #include <string.h&g

Sicily 1146:Lenny&#39;s Lucky Lotto(dp)

题意:给出N,M,问有多少个长度为N的整数序列,满足所有数都在[1,M]内,并且每一个数至少是前一个数的两倍.例如给出N=4, M=10, 则有4个长度为4的整数序列满足条件: [1, 2, 4, 8], [1, 2, 4, 9], [1, 2, 4, 10], [1, 2, 5, 10] 分析:可用动态规划解题,假设dp[i][j],代表满足以整数i为尾数,长度为j的序列的个数(其中每一个数至少是前一个数的两倍).那么对于整数i,dp[i][j] 等于所有dp[k][j-1]的和,其中k满足:

UVA542 - France &#39;98(dp)

UVA542 - France '98(dp) 题目链接 题目大意:之前题目意思还以为看懂了,其实没看明白,它已经把各个选手分在各自所在的区域里面,这就意味着第一次的PK的分组已经确定,而且冠军必须是从两个左右分区出来的胜利者才有机会pk冠军. 解题思路:那么从1-16这个大的区间内诞生出来的冠军可能是来自左边,也可能是右边,然后再左边右边的子区间递归找出冠军.f[i][l][r]表示l-r这个区间的胜利者是i的概率,那么假设i在区间的最左边,f[i][l][r] = Sum(f[i][l][m

HDU 4968 Improving the GPA(dp)

HDU 4968 Improving the GPA 题目链接 dp,最大最小分别dp一次,dp[i][j]表示第i个人,还有j分的情况,分数可以减掉60最为状态 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int t, avg, n; double dp1[15][405], dp2[15][405]; double get(int x) { if

URAL 1167. Bicolored Horses (DP)

题目链接 题意 :农夫每天都会放马出去,然后晚上把马赶入马厩,于是让马排成一行入马厩,但是不想马走更多的路,所以让前p1匹入第一个马厩,p2匹马入第二个马厩…………但是他不想让他的任何一个马厩空着,所有的马都必须入马厩.有两种颜色的马,如果 i 匹黑马与 j 匹白马同在一个马厩,不愉快系数是 i * j,总系数就是k个系数相加.让总系数最小. 思路 : dp[i][j] 代表的是前 i 个马厩放 j 匹马的最小不愉快系数值. 1 //1167 2 #include <cstdio> 3 #in

2014多校第七场1005 || HDU 4939 Stupid Tower Defense (DP)

题目链接 题意 :长度n单位,从头走到尾,经过每个单位长度需要花费t秒,有三种塔: 红塔 :经过该塔所在单位时,每秒会受到x点伤害. 绿塔 : 经过该塔所在单位之后的每个单位长度时每秒都会经受y点伤害. 蓝塔 : 经过该塔所在单位之后,再走每个单位长度的时候时间会变成t+z. 思路 : 官方题解 : 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define LL long long

hdu4939 Stupid Tower Defense (DP)

2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 366    Accepted Submission(s): 88 Problem Description FSF is addicted to a stupid tower defense game.

Codeforces Round #260 (Div. 1) A. Boredom (DP)

题目链接:http://codeforces.com/problemset/problem/455/A A. Boredom time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Alex doesn't like boredom. That's why whenever he gets bored, he comes up with