hihoCoder 1033
题目链接:
http://hihocoder.com/problemset/problem/1033
听说这个题是xiaodao出的~~
我们要知道dp其实就是一个记忆化搜索的过程,如果某个子结构之前搜索过了,那么这次我们就不搜索了。
所以数位dp记录的其实就是dp[pos][state]pos位以内满足条件state的情况数。
当然,作为第二次做数位dp的渣渣,我觉得还是得强调几点:
1、一定要记录一个limit,代表这一位的取数是否受限制。
2、记录一个flag,代表之前的数是否都是前导0。
3、注意(!flag&&!limit)的情况下再给dp[pos][state]赋值。
剩下的好像就没啥了。。。dfs就行,注意递归结束条件。。。
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std;
const int maxn = ;
const int maxs = ;
const long long mod = + ; typedef long long int64; typedef struct Node{
int64 cnt, sum; Node(){
cnt = sum = ;
} Node( int64 cnt, int64 sum ){
this->cnt = cnt;
this->sum = sum;
} Node(const struct Node& node){
cnt = node.cnt;
sum = node.sum;
}
}Node; Node dp[maxn][maxs][];
int64 l, r;
int k; int64 c[maxn];
int digit[maxn]; void Init(void){
c[] = ;
for( int i = ; i <= ; ++i ){
c[i] = (c[i-] * )%mod;
}
} Node dfs( int pos, int sum, int p, int flag, int limit ){
Node ans;
if( sum < || sum > )
return Node(, ); if( pos < ){
if(flag)
ans.cnt = ;
else
ans.cnt = (sum == ) ? : ;
ans.sum = ;
return ans;
} if(!flag && !limit && dp[pos][sum][p].cnt != -)
return dp[pos][sum][p];
int last = limit ? digit[pos] : ; Node a;
ans.cnt = , ans.sum = ;
for( int i = ; i <= last; ++i ){
if( i == && flag ){
a = dfs( pos-, sum, p, flag, limit&&(i == last) );
}else{
if(p){
a = dfs( pos-, sum-i, p^, , limit&&(i == last) );
}else{
a = dfs( pos-, sum+i, p^, , limit&&(i == last) );
}
}
ans.cnt = (ans.cnt + a.cnt + mod)%mod;
ans.sum = (ans.sum + (c[pos]*i%mod*a.cnt)%mod + a.sum + mod)%mod;
} if(!limit && !flag){
dp[pos][sum][p].cnt = ans.cnt;
dp[pos][sum][p].sum = ans.sum;
} return ans;
} int bitSet( int64 num ){
int len = ;
memset( digit, , sizeof(digit) ); while(num){
digit[len++] = num%;
num /= ;
} return len-;
} void InitDP(void){
memset( dp, -, sizeof(dp) );
} void solve(void){
InitDP(); int len;
len = bitSet(l-);
//cout << "len1: " << len << endl;
Node ans1 = dfs(len, k+, , , );
//cout << ans1.sum << endl;
len = bitSet(r);
//cout << "len2: " << len << endl;
Node ans2 = dfs(len, k+, , , ); printf("%lld\n", ((ans2.sum - ans1.sum + mod)%mod));
} int main(void){
Init();
while(scanf("%lld%lld%d", &l, &r, &k) != EOF){
solve();
} return ;
}
注意下dfs过程中sum不能小于0或超过200。
hihoCoder 1033的更多相关文章
- [hihocoder 1033]交错和 数位dp/记忆化搜索
#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...
- hihoCoder #1033 : 交错和 (数位Dp)
题目大意: 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数: f(x) = a0 - a1 + a2 - ... + ( - 1)n - ...
- hihoCoder 1033 : 交错和 数位dp
思路:数位dp,dp(i, j, k)表示考虑i位数,每位数可以任意取[0~9],并且这i位数的交错和为j,k=1表示前缀全是0(如000456),k=0表示前缀不为0.注意,前缀是否为0是这道题的一 ...
- hihoCoder 1033: 交错和
(1)题目描述: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错 ...
- HihoCoder 1033交错和(数位DP第三题)
(写挂了,有空再补) 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义 ...
- 【HIHOCODER 1033 】 交错和(数位DP)
描述 输入 输入数据仅一行包含三个整数,l, r, k(0 ≤ l ≤ r ≤ 1018, |k| ≤ 100). 输出 输出一行一个整数表示结果,考虑到答案可能很大,输出结果模 109 + 7. 提 ...
- 【hihoCoder】1033: 交错和
初探数位dp 介绍了数位类统计的基础知识.以下列出其中的基础点: 基本问题 统计在区间[l, r]中满足条件的数的个数 思路 1. [l, r] 将问题转换为 在[0, r]中满足条件的个数 - 在[ ...
- hihocoder -1121-二分图的判定
hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...
- Hihocoder 太阁最新面经算法竞赛18
Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...
随机推荐
- 【sqli-labs】 less57 GET -Challenge -Union -14 queries allowed -Variation4 (GET型 挑战 联合查询 只允许14次查询 变化4)
双引号闭合 http://192.168.136.128/sqli-labs-master/Less-57/?id=1"%23 和less56一样查数据
- 【sqli-labs】 less51 GET -Error based -Order By Clause -String -Stacked injection(GET型基于错误的字符型Order By从句堆叠注入)
less50的字符型版本,闭合好引号就行 http://192.168.136.128/sqli-labs-master/Less-51/?sort=1';insert into users(id,u ...
- struts2.5.2 通配符问题_亲测有用
学了一段时间struts2,跟着教程做,但发现struts2的版本不同,很多东西的使用是有差异的.例如之前遇到的创建sessionFactory的方式就跟之前版本有着明显的差异.今天又遇到一个问题,那 ...
- 常见的Xshell运行命令
最近接触到了Xshell这个软件,使用这个软件我们来进行连接Linux系统,进去之后我们可能会两眼一抹黑,小编就带大家来学些常见的shell命令. 首先我们要跟大家从最简单的聊起,我们进入Xshell ...
- Java-Class-Miniprogram:com.ylbtech.common.utils.miniprogram.TemplateMessage
ylbtech-Java-Class-Miniprogram:com.ylbtech.common.utils.miniprogram.TemplateMessage 1.返回顶部 1.1. pack ...
- Js—innerHTML和innerText的区别
1.innerHTML属性和innerText属性 都是对元素的一个操作,简单讲,innerHTML可以在某种特定环境下重构某个元素节点的DOM结构,innerText只能修改文本值 在JavaScr ...
- 救济金发放(The Dole Queue, UVa 133)
n(n<20)个人站成一圈,逆时针编号为1-n.有两个官员,A从1开始逆时针数,B从n开 始顺时针数.在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个 官员停在同一个人上) ...
- uva 1587(Box UVA - 1587)
题目大意是给定6个数对,每个数对代表一个面的长和宽,判断这6个面是否能构成一个长方体. 这种题一看很复杂,但是只要不想多了实际上这就是一个水题... 首先说明一下判断的思路: 1.长方体是有三个对面的 ...
- 关于linux内核用纯c语言编写的思考
在阅读linux2.6 版本内核的虚拟文件系统和驱动子系统的时候,我发现内核纯用c语言编写其实也是有一点不方便,特别是内核中大量存在了对象的概念,比如说文件对象,描述起来使用对象描述,但是对象在c语言 ...
- Python那点事
目录 Python那点事 一. Python介绍 二. 目前python的主要领域 三.Python的运用 四. Python的发展史 Python的种类 Python那点事 相信很多小伙伴会跳过此环 ...