zoukankan      html  css  js  c++  java
  • 20180523模拟赛T1——前缀?

    (a.cpp/c/pas)
    Time Limit:1 Sec Memory Limit:128 MB

    简化版题意

    jyt毒瘤,写了超长的题面,要看完整题面的翻到最后……

    老太太认为一个长度为 N 的仅由‘0’、‘1’、‘2’三个字符组成的字符串是贾家的,当且仅当这个字符串满足以下几点:

    1. 这个字符串的所有前缀(不包括这个串本身)都是贾家的。
    2. 这个字符串中字符‘2’出现的个数不少于字符‘1’出现的个数。
    3. 这个字符串中字符‘1’出现的个数不少于字符‘0’出现的个数。

    请你求出有多少个长度为 N 的字符串是贾家的,由于答案可能很大,你只需要给出答案 mod 1,000,000,007 的值。

    Input

    第一行一个正整数 N,表示字符串的长度。

    Output

    输出一个正整数,表示答案。

    Sample Input

    3

    Sample Output

    4

    Sample Explanation

    这 4 个字符串分别为“221”、“212”、“210”、“222”。

    Data Limitation

    对于 20%的数据:N≤10。
    对于 50%的数据:N≤20。
    对于 80%的数据:N≤300。
    对于 100%的数据:N≤400。

    题解

    dp,设(f[i][j][k])表示总长度为(i),有(j)(0)(k)(1)。大力转移?开一个(400^3)的数组,发现MLE了,听说可以卷一下,然而不会啊……

    int f[maxn][maxn][2];
    f[0][0][0]=1;
    for(int i=1;i<=n;i++)
    	for(int j=0;j<=i;j++)
    		for(int k=j;j+k<=i;k++)
    		{
    			int l=i-j-k,tp=i%2;
    			f[j][k][tp]=0;
    			if(l<k) break;
    			if(j>0) (f[j][k][tp]+=f[j-1][k][tp^1])%=MOD;
    			if(k>j) (f[j][k][tp]+=f[j][k-1][tp^1])%=MOD;
    			if(l>k) (f[j][k][tp]+=f[j][k][tp^1])%=MOD;
    			if(i==n) (ans+=f[j][k][tp])%=MOD;
    		}
    

    对于这种方法,首先可以选择打表。跑得又快,又不用管内存(orz dfs大佬cqz神犇)。

    当然,也可以选择进一步缩小(j, k)的范围。不难发现(3jle i,2kle(i-j)),于是只要枚举合法的部分即可,数组也可以缩小。

    for(int i = 1; i <= n; ++i)
    	for(int j = 0; 3*j <= i; ++j)
    		for(int k = j; (k<<1) <= (i-j); ++k)
    		{
    			dp[i][j][k] = (dp[i-1][j-1][k] + dp[i-1][j][k]) % mod;
    			dp[i][j][k] = (dp[i-1][j][k-1] + dp[i][j][k]) % mod;
    		}
    

    原版题面

    且说黛黛自那日弃舟登岸时,便有荣国府打发了轿子并拉行李的车辆久候了。这黛黛常听得母亲说过,他外祖母家与别家不同。他近日所见的这几个三等仆妇,吃穿用度,已是不凡了,何况今至其家。因此步步留心,时时在意,不肯轻易多说一句话,多行一步路,惟恐被人耻笑了他去。自上了轿,进入城中,从纱窗向外瞧了一瞧,其街市之繁华,人烟之阜盛,自与别处不同。又行了半日,忽见街北蹲着两个大石狮子,三间兽头大门,门前列坐着十来个华冠丽服之人。正门却不开,只有东西两角门有人出入。正门之上有一匾,匾上大书“敕造宁国府”五个大字。黛黛想道:这必是外祖之长房了。想着,又往西行,不多远,照样也是三间大门,方是荣国府了。却不进正门,只进了西边角门。那轿夫抬进去,走了一射之地,将转弯时,便歇下退出去了。后面的婆子们已都下了轿,赶上前来。另换了三四个衣帽周全十七八岁的小厮上来,复抬起轿子。众婆子步下围随至一垂花门前落下。众小厮退出,众婆子上来打起轿帘,扶黛黛下轿。黛黛扶着婆子的手,进了垂花门,两边是抄手游廊,当中是穿堂,当地放着一个紫檀架子大理石的大插屏。转过插屏,小小的三间厅,厅后就是后面的正房大院。正面五间上房,皆雕梁画栋,两边穿山游廊厢房,挂着各色鹦鹉、画眉等鸟雀。台矶之上,坐着几个穿红着绿的丫头,一见他们来了,便忙都笑迎上来,说:“刚才老太太边做题还念呢,可巧就来了。”于是三四人争着打起帘笼,一面听得人回话:“黛姑娘到了。”黛黛忙问:“不知老太太做的是什么题?”那丫鬟答道:“说来话长。老太太认为一个长度为 N 的仅由‘0’、‘1’、‘2’三个字符组成的字符串是贾家的,当且仅当这个字符串满足以下几点:

    1. 这个字符串的所有前缀(不包括这个串本身)都是贾家的。
    2. 这个字符串中字符‘2’出现的个数不少于字符‘1’出现的个数。
    3. 这个字符串中字符‘1’出现的个数不少于字符‘0’出现的个数。

    请你求出有多少个长度为 N 的字符串是贾家的,由于答案可能很大,你只需要给出答案 mod 1,000,000,007 的值。

    题目大概就是这样,黛姑娘还是快进房吧,不然老太太等急了。”

  • 相关阅读:
    Java基础教程:面向对象编程[3]
    Java拓展教程:文件DES加解密
    JavaScript:学习笔记(4)——This关键字
    jQuery:[2]百度地图开发平台实战
    Android开发——减小APK大小
    玩转ButterKnife注入框架
    Java技术——多态的实现原理
    RxAndroid结合Retrofit,看看谁才是最佳拍档!
    Android开发——AsyncTask的使用以及源码解析
    10本比较鸡肋的技术类书籍,简要回顾
  • 原文地址:https://www.cnblogs.com/pfypfy/p/9079091.html
Copyright © 2011-2022 走看看