题目传送

先给出设计dp的结论:

dp[i][j]:以第i个位置、以rankj的数拓展出去的方案数。意会一下,我实在想不好语言……

其中所谓rankj=真·rank%11

找到拓展的规律,转移也就顺理成章了。不妨先看1~9拓展到的二位数里有哪些是合法拓展:

\[Rank1\%11=1:所以数字1\rightarrow10
\]

\[Rank2\%11=2:所以数字2\rightarrow20\ 21
\]

\[……
\]

\[Rank9\%11=9:所以数字9\rightarrow90\ 91\ 92\ 93\ 94\ 95\ 96\ 97\ 98
\]

再拓展到三位数找找规律:

\[Rank10\%11=10:所以数字10\rightarrow100\ 101......109
\]

\[Rank11\%11=0:所以数字20\rightarrow无法拓展
\]

\[Rank12\%11=1:所以数字21\rightarrow210
\]

\[Rank13\%11=2:所以数字30\rightarrow300\ 301
\]

可以看出能够拓展的个数也是按照%11的规则循环的,所以我们要在rank之间做转移(以下说rank都是%11以后的rank,不%11的话状态太多)

规律:

1.当前rank转移过去的数字,个位数字一定小于rank

2.如果我们每11个合法数分为一组,则这11个数将拓展出新的55个数(注意这是会%11 = 0的),也就意味着$$0\ 1\ 2\ 3\ 4\ 5\ 6\ 7\ 8\ 9\ 10\ $$$$20\ 21\ 30\ 31\ 32\ 40\ 41\ 42\ 43\ 50\ 51$$$$……$$每11个数会拓展出55个新数(反正0也不贡献,可加)。

现在举例:$$51排名j为10;$$$$51拓展出的\rightarrow510的排名j'将为10$$怎么算的呢?更普遍化地来说,当前数字排名为j时,假如它向后拓展一位,然后个位数字为d,则新数字排名为$$(\frac{j(j-1)}{2}+(d+1)+(10-1))\ %\ 11$$这样理解,比如51要拓展到512,$$\frac{109}{2}是20~50拓展出的三位数个数$$$$d+1=2+1是510~512$$$$10-1是1~9的rank加上去$$

对于第一条,发现0~10拓展出55个数(我们一开始就列了),所以0~10拓展出的数目%11后为0并不影响rank。所以只计算20~50的即可。其他也是同理,因为我们是11个一组的;

第二条不解释;

对于第三条,我们只加了0~10拓展的数为开始的,却没加1~10(这时就别算0了),然后为啥-1呢?因为0~10拓展的数里本来就有个10了,10算了两遍。也就相当于把1~9加上。

懂了以上式子以后就可以直接看代码了:

#include <cstdio>
#include <cstring> const int maxn = 1e5 + 5;
char S[maxn];
__int64_t ans, dp[maxn][15];//以第i个位置、以rankj的数拓展出去的方案数 int main() {
scanf("%s", S + 1);
int len = strlen(S + 1); for (int i = len; i; --i) {
int d = S[i] - '0'; for (int j = 0; j <= 10; ++j) {
dp[i][j] = 1;//自己独立成一个方案
if (i < len) {
int t = S[i + 1] - '0';
if (j > t) {//与后面联合,当前rank只会转移到更小的数字
dp[i][j] += dp[i + 1][(j * (j - 1) / 2 + t + 10) % 11];//事实上只有两位数的转移也可以直接打表
}
}
} if (d) ans += dp[i][d];//题目限制从1~9为起点
} printf("%lld\n", ans);
return 0;
}

Codeforces 1142D(dp)的更多相关文章

  1. Codeforces 1131G(dp)

    传送门 与Codeforces1107G一起食用 思路 想到要用dp--然后常规地设dp[i]为推倒前i个牌的最小花费 有两种情况:一是当前这个推,二是不推而被别人推.对于第一种,需要找到这个左推(因 ...

  2. Codeforces 1107F(dp)

    怎么就没人解释一下为啥用b排序可以保证正确性呢……太菜了,理解了好久. 时间流逝价值会丢失的背包,类似题洛谷1417 本题与洛谷1417不同之处在于流逝是有截止的. 1.这个dp[j]的含义是:最后跑 ...

  3. Codeforces 1107G(dp)

    1.答案要取连续的区间疯狂暗示线段树. 2.外层枚举r,内层枚举l显然过于暴力. 3.考虑内层的优化.dp[i]:以第i位为结尾的答案(长度大于1的).dp[i] = max(第一种情况,第二种情况) ...

  4. codeforces 682D(DP)

    题目链接:http://codeforces.com/contest/682/problem/D 思路:dp[i][j][l][0]表示a串前i和b串前j利用a[i] == b[j]所得到的最长子序列 ...

  5. codeforces 666A (DP)

    题目链接:http://codeforces.com/problemset/problem/666/A 思路:dp[i][0]表示第a[i-1]~a[i]组成的字符串是否可行,dp[i][1]表示第a ...

  6. Codeforces 1144G(dp)

    据说这题是种dp的套路?然后被我国红名神仙(南大Roundgod)贪心了,不过思路上非常相近了,故而可贪吧. 设的dp[i][0]是:如果把第i个数放在上升序列里了,那么下降序列结尾的那个最大是多少: ...

  7. Codeforces 1152D(dp)

    要点 寻找最多边的匹配的结论:贪心地从叶子开始找,最后答案都是奇数层下边的那条边. 设\(dp[i][j]\)表示当前长度为\(i\),平衡度为\(j\),平衡度为(数量减去)数量. 增加左右括号转移 ...

  8. Three displays CodeForces - 987C (dp)

    C. Three displays time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  9. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

随机推荐

  1. Redis底层探秘(二):链表和跳跃表

    链表简介 链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地跳转链表的长度. 作为一种常用数据结构,链表内置在很多高级的编程语言里面,因为Redis使用C语言并没有内 ...

  2. 20181229模拟 T1 palindrome

    20181229模拟 T1 palindrome 题意 : \(S\)是字符串\(s\)的子串可重集,求\(\sum\limits_{x\in S}\sum\limits_{y\in S}(|x|+| ...

  3. [ZOJ2587]Unique Attack

    vjudge sol 最小割判定唯一性. 只要做完一个任意最小割后,判断一下是不是所有点都要么和\(S\)相连,要么和\(T\)相连. 只要两边各一次\(dfs\)就行了. code #include ...

  4. 高性能服务器架构 的几个注意点 (High-Performance Server Architecture)

    High-Performance Server Architecture 高性能服务器架构 来源:http://pl.atyp.us/content/tech/servers.html译文来源:htt ...

  5. mendeley 参考文献管理工具

    本文由Suzzz原创,发布于http://www.cnblogs.com/Suzzz/p/4044144.html,转载请保留此声明 目录 介绍 功能 运行截图 安装方法 创建 Desktop Ent ...

  6. Python 设计一个简单的计算器

    设计目标 实现加减乘除及拓号优先级解析 用户输入'1 - 2 * ( (6-3 +(-5/5)*(9-2*3/3 + 7/3*7/4*12 +10 * 5/5 )) - (-4*3)/ (12-3*2 ...

  7. POJ2230(打印欧拉回路)

    Watchcow Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 7473   Accepted: 3270   Specia ...

  8. (转)更改Web.config中对上传文件大小限制

    .net上传超过200K的图片的时候,会跳转到404,但是url没有错误,真J8的坑啊. 本文转载自:http://www.cnblogs.com/zwffff/archive/2009/04/29/ ...

  9. java代码equals方法

    package com.bc; public class Test_6 { // 我们知道java中的每个类都继承自Object类,equals是Object方法之一 String name; int ...

  10. 使用spring-boot-starter-amqp开发生产者应用

    上一篇我们介绍了如何使用spring AMQP和RabbitMQ结合,开发消费者应用程序,使用的是Xml配置的Spring框架. 本篇我们仍然使用Spring AMQP开发生产者应用,不过我们使用零 ...