题目传送

先给出设计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. MySQL 大数据量修改表结构问题

    前言: 在系统正常运作一定时间后,随着市场.产品汪的需求不断变更,比较大的一些表结构面临不得不增加字段的方式来扩充满足业务需求:  而 MySQL 在体量上了千万.亿级别数据的时候,Alter Tab ...

  2. UVA - 11019 Matrix Matcher (二维字符串哈希)

    给你一个n*m的矩阵,和一个x*y的模式矩阵,求模式矩阵在原矩阵中的出现次数. 看上去是kmp在二维情况下的版本,但单纯的kmp已经无法做到了,所以考虑字符串哈希. 类比一维情况下的哈希算法,利用容斥 ...

  3. 数据清洗记录,pandas

    pandas数据清洗:http://www.it165.net/pro/html/201405/14269.html data=pd.Series([1,2,3,4]) data.replace([1 ...

  4. P1230 智力大冲浪(洛谷)

    题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元.先不要太高兴!因为这些钱还不一定都是你的?!接下来主持人宣布了比赛规则: ...

  5. 类和对象(12)—— this指针

    首先,我们都知道类的成员函数可以访问类的数据(限定符只是限定于类外的一些操作,类内的一切对于成员函数来说都是透明的),那么成员函数如何知道哪个对象的数据成员要被操作呢,原因在于每个对象都拥有一个指针: ...

  6. FastAdmin 中的 formatter flag 分析

    FastAdmin 中的 formatter flag 分析 效果 首先看看效果,这里的文字和颜色可以根据数据改变. 这是系统自带的分类管理. 代码 功能在 \public\assets\js\bac ...

  7. 10.Selenium+Python+任务计划程序实现定时发送邮件

    一.python具体代码实现 # coding=utf-8 import smtplib from email.mime.text import MIMEText from email.header ...

  8. 序章:为什么学习使用kotlin、及kotlin的一些碎碎念

    为什么使用kotlin? 当然是因为项目目前的开发语言是kotlin啊! 一方面是想能够尽快适应项目,另一方面,kotlin这门语言独特的语法,确实很吸引我,也让我意识到java代码在某些程度上的繁琐 ...

  9. 最长递增子序列 LIS 时间复杂度O(nlogn)的Java实现

    关于最长递增子序列时间复杂度O(n^2)的实现方法在博客http://blog.csdn.net/iniegang/article/details/47379873(最长递增子序列 Java实现)中已 ...

  10. bae3.0第三步 添加默认管理后台模块和mysql库

    1.创建数据库 先在本地的mysql数据库中创建数据库db_blog,执行python manage.py syncdb来创建表. 然后将数据库中的表导入到bae上的数据库中.2.配置数据库 修改项目 ...