题意:首先定义了一种类数(标志数)

1:1到9都是标志数。

2:若x / 10是标志数,假设x /10在标志数中的排名是k, 若x的个位数小于k % 11, 那么x也是标志数。

现在给你一个字符串,问有多少个子串代表的数字是标志数?

思路:我们先假设已经求出的所有的标志数,并且知道每个标志数的rank(rank已经对11取模)。设dp[i][j]是第i个数字和第 i - 1位数字构成的2位数的rank为j,并且最高2位为这两位数字的合法数字的数目。可能有点拗口,我们举一个例子。

假设字符串是321, 我们计算合法的子串有多少个。首先,dp[1][1]是1,所以1对答案的贡献是1。我们再看2对答案的贡献,合法的串有21, 2。2对答案的贡献是1,21是怎么来的呢?21的rank是1,所以dp[2][2] += dp[3][1],21来源于dp[3][1]。我们在看3对答案的贡献,3构成的合法的串是3, 32, 321。3对答案的贡献是1,那么32, 321是怎么来的呢?32的rank是6, 所以需要知道dp[2][6]是多少。2位置本身有个2,可以构成32,那么321怎么来的?321的rank是4,所以需要知道dp[3][4]是多少,dp[3][4]是1,所以返回1就行了。那么我们直接提前把答案的贡献累加上,当2前面的数与2构成的数rank是6的时候,可以知道此时前面的数与21构成的数(rank是4)也是对答案有贡献的,所以dp[2][6]是2。转移的时候可以暴力打表,打出每个2位数的rank,或者算出来就行了。

具体做法看我队友的博客就行了。

代码:

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 100010;
LL dp[maxn][11];
LL ans = 0;
char s[maxn];
int main() {
scanf("%s",s + 1);
int n = strlen(s + 1);
for (int i = n; i >= 1; i--) {
for (int j = 0; j <= 10; j++) {
dp[i][j] = 1;
int t = s[i + 1] - '0';
if(i < n && j > t) {
dp[i][j] += dp[i + 1][(j * (j - 1) / 2 + t + 10) % 11];
}
}
if(s[i] != '0') ans += dp[i][s[i] - '0'];
}
printf("%lld\n", ans);
}

  

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

  1. Codeforces 1142D(dp)

    题目传送 先给出设计dp的结论: dp[i][j]:以第i个位置.以rankj的数拓展出去的方案数.意会一下,我实在想不好语言-- 其中所谓rankj=真·rank%11 找到拓展的规律,转移也就顺理 ...

  2. codeforces 682D(DP)

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

  3. codeforces 666A (DP)

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

  4. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  5. Codeforces 55D (数位DP+离散化+数论)

    题目链接: http://poj.org/problem?id=2117 题目大意:统计一个范围内数的个数,要求该数能被各位上的数整除.范围2^64. 解题思路: 一开始SB地开了10维数组记录情况. ...

  6. Codeforces 264B 数论+DP

    题目链接:http://codeforces.com/problemset/problem/264/B 代码: #include<cstdio> #include<iostream& ...

  7. CodeForces 398B 概率DP 记忆化搜索

    题目:http://codeforces.com/contest/398/problem/B 有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了 ...

  8. CodeForces 512B(区间dp)

    D - Fox And Jumping Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64 ...

  9. CodeForces - 1051D Bicolorings(DP)

    题目链接:http://codeforces.com/problemset/problem/1051/D 看了大佬的题解后觉着是简单的dp,咋自己做就做不来呢. 大佬的题解:https://www.c ...

随机推荐

  1. Java发展前景与职业方向解析

    大多数人选择Java可能只是因为听说Java前景好.Java比较好找工作.Java语言在TIOBE排行榜上一直位于前三等等之类的原因,但是Java具体好在哪里,心里却是没有什么概念的.本文为你解答学J ...

  2. 你所不知道的,Java 中操作符的秘密?

    在 Java 编程的过程中,我们对数据的处理,都是通过操作符来实现的.例如,用于赋值的赋值操作符.用于运算的运算操作符等.用于比较的比较操作符,还包括逻辑操作符.按位操作符.移位操作符.三元操作符等等 ...

  3. 使用Kali Linux执行中间人攻击(演示)

    中间人攻击也叫Man-In-The-Middle-Attack. 我假设你已经知道中间人攻击的基本概念,引用一段wikipedia: 中间人攻击(Man-in-the-middle attack,缩写 ...

  4. 类里边的构造函数可以被private修饰,在类的内部创建对象。利用这种特性创建单类模式

  5. 关于for循环中是否需要缓存length值的个人总结

    在JS性能优化中,有一个常见的小优化,即 // 不缓存 for (var i = 0; i < arr.length; i++) { ... } // 缓存 var len = arr.leng ...

  6. [Luogu4390][BOI2007]Mokia 摩基亚

    luogu 题意 支持平面内单点加一个值以及矩阵求和. 平面大小\(W\le2*10^6\),修改操作\(\le1.6*10^5\),查询操作\(\le10^4\) sol \(CDQ\)写一发. 把 ...

  7. 给UIButton设置阴影及动画组

    //设置“开启旅程”按钮 UIButton *startBtn = self.startBtn; CGFloat btnW = ; CGFloat btnH = ; CGFloat btnX = (s ...

  8. 【LeetCode】129. Sum Root to Leaf Numbers

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...

  9. 11g R2 rac linstener 监听配置

    两个节点host,ipvip ,scan的信息 #eth0-Public IP 162.12.0.1    cqltjcpt1 162.12.0.3    cqltjcpt2 #eth1 PRIVAT ...

  10. (转)安装Android SDK时遇到Failed to rename directory

    安装Android SDK时遇到Failed to rename directory E:\Java\Android SDK\android-sdk_r06-windows\android-sdk-w ...