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 的值。

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

  • 相关阅读:
    机器学习(深度学习)
    机器学习(六)
    机器学习一-三
    Leetcode 90. 子集 II dfs
    Leetcode 83. 删除排序链表中的重复元素 链表操作
    《算法竞赛进阶指南》 第二章 Acwing 139. 回文子串的最大长度
    LeetCode 80. 删除有序数组中的重复项 II 双指针
    LeetCode 86 分割链表
    《算法竞赛进阶指南》 第二章 Acwing 138. 兔子与兔子 哈希
    《算法竞赛进阶指南》 第二章 Acwing 137. 雪花雪花雪花 哈希
  • 原文地址:https://www.cnblogs.com/pfypfy/p/9079091.html
Copyright © 2011-2022 走看看