Codeforces 1142D Foreigner (DP)
题意:首先定义了一种类数(标志数)
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)的更多相关文章
- Codeforces 1142D(dp)
题目传送 先给出设计dp的结论: dp[i][j]:以第i个位置.以rankj的数拓展出去的方案数.意会一下,我实在想不好语言-- 其中所谓rankj=真·rank%11 找到拓展的规律,转移也就顺理 ...
- codeforces 682D(DP)
题目链接:http://codeforces.com/contest/682/problem/D 思路:dp[i][j][l][0]表示a串前i和b串前j利用a[i] == b[j]所得到的最长子序列 ...
- codeforces 666A (DP)
题目链接:http://codeforces.com/problemset/problem/666/A 思路:dp[i][0]表示第a[i-1]~a[i]组成的字符串是否可行,dp[i][1]表示第a ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- Codeforces 55D (数位DP+离散化+数论)
题目链接: http://poj.org/problem?id=2117 题目大意:统计一个范围内数的个数,要求该数能被各位上的数整除.范围2^64. 解题思路: 一开始SB地开了10维数组记录情况. ...
- Codeforces 264B 数论+DP
题目链接:http://codeforces.com/problemset/problem/264/B 代码: #include<cstdio> #include<iostream& ...
- CodeForces 398B 概率DP 记忆化搜索
题目:http://codeforces.com/contest/398/problem/B 有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了 ...
- CodeForces 512B(区间dp)
D - Fox And Jumping Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64 ...
- CodeForces - 1051D Bicolorings(DP)
题目链接:http://codeforces.com/problemset/problem/1051/D 看了大佬的题解后觉着是简单的dp,咋自己做就做不来呢. 大佬的题解:https://www.c ...
随机推荐
- Python打包上传
你可以用pip导出你的dependency: $ pip freeze > requirements.txt 然后在通过以下命令安装dependency: pip install -r requ ...
- 伪元素:focus-within
1.盒子边框的线条动画: <div class="cont"> <div class="bb"></div> </di ...
- 【MFC】断言(ASSERT)的用法
摘自:Moondark http://www.cnblogs.com/moondark/archive/2012/03/12/2392315.html 断言(ASSERT)的用法 我一直以为as ...
- 生动有趣地讲解Map/Reduce基本原理
Hadoop简介 Hadoop就是一个实现了Google云计算系统的开源系统,包括并行计算模型Map/Reduce,分布式文件系统HDFS,以及分布式数据库Hbase,同时Hadoop的相关项目也很丰 ...
- spring的笔记1 关云长
1.1 实例化方式 l 3种bean实例化方式:默认构造.静态工厂.实例工厂 1.1.1 默认构造 <bean id="" class=""> ...
- 【spring源码学习】spring的AOP面向切面编程的实现解析
一:Advice(通知)(1)定义在连接点做什么,为切面增强提供织入接口.在spring aop中主要描述围绕方法调用而注入的切面行为.(2)spring定义了几个时刻织入增强行为的接口 => ...
- test20181219 奇怪的函数
题意 奇怪的函数 [问题描述] 使得x^x达到或超过n位数字的最小正整数x是多少? [文件输入] 输入一个正整数n(n<=2*10^9). [文件输出] 输出使得x^x达到n位数字的最小正整数x ...
- 主窗体上按钮jig画图时,CAD得不到焦点的问题
主窗体上按钮jig画图时,CAD得不到焦点的问题 按钮不要用 Click 事件,用 MouseDown 事件, 可完美解决该问题 1.试过CAD窗体获得焦点,不顶用 2.试用用命令行去执行,可行 ...
- (转)Eclipse 扩大内存
导入整个大工程的时候 Eclipse总是直接黑屏 然后就不可操作了.就算侥幸进入了Eclipse也会突然在复制,或者 查询某些语句的时候黑屏.极度的影响心情和工作效率. 明显是内存不够的感觉,可是电脑 ...
- mongodb数据操作(CRUD)
1.数据插入db.集合名.insert() 操作 > use hk switched to db hk > show collections > db.info.insert({&q ...