题目链接:

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的更多相关文章

  1. [hihocoder 1033]交错和 数位dp/记忆化搜索

    #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...

  2. hihoCoder #1033 : 交错和 (数位Dp)

    题目大意: 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数: f(x) = a0 - a1 + a2 - ... + ( - 1)n - ...

  3. hihoCoder 1033 : 交错和 数位dp

    思路:数位dp,dp(i, j, k)表示考虑i位数,每位数可以任意取[0~9],并且这i位数的交错和为j,k=1表示前缀全是0(如000456),k=0表示前缀不为0.注意,前缀是否为0是这道题的一 ...

  4. hihoCoder 1033: 交错和

    (1)题目描述: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错 ...

  5. HihoCoder 1033交错和(数位DP第三题)

    (写挂了,有空再补) 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义 ...

  6. 【HIHOCODER 1033 】 交错和(数位DP)

    描述 输入 输入数据仅一行包含三个整数,l, r, k(0 ≤ l ≤ r ≤ 1018, |k| ≤ 100). 输出 输出一行一个整数表示结果,考虑到答案可能很大,输出结果模 109 + 7. 提 ...

  7. 【hihoCoder】1033: 交错和

    初探数位dp 介绍了数位类统计的基础知识.以下列出其中的基础点: 基本问题 统计在区间[l, r]中满足条件的数的个数 思路 1. [l, r] 将问题转换为 在[0, r]中满足条件的个数 - 在[ ...

  8. hihocoder -1121-二分图的判定

    hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...

  9. Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...

随机推荐

  1. Codeforces_733C

    C. Epidemic in Monstropolis time limit per test 1 second memory limit per test 256 megabytes input s ...

  2. sublime text3 verilog代码编写高级操作篇

    2018.10.21 好久没写博客了,这段时间一直在学习一直在沉淀,然而发现学的越多会的更少,只能快马加鞭吧! 博主从大一暑假接触FPGA,到现在快一年半了,时间恍逝.刚开始入门也是用的quartus ...

  3. Day 13 进程和线程

    进程和线程 今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务 ...

  4. 转载:python 日期,季度,年份

    # 这个data_matrix[:,dimen] <= thresh_val 内标会返回data_matrix当中的值符合条件的,返回为True # ret_array 中就会返回 下标为Tru ...

  5. 68.document增删改原理

    主要知识点 document增的原理 document删的原理 document改的原理 一.document增的原理 一个document存入es大致要分以下几个步骤 (1)数据写入buffer, ...

  6. Vue.js:使用vue-cli快速构建项目

    vue-cli是什么? vue-cli 是vue.js的脚手架,用于自动生成vue.js模板工程的. vue-cli怎么使用? 安装vue-cli之前,需要先安装了vue和webpack,不知道怎么安 ...

  7. ThinkPHP5.1安装

    安装 ====== 按照官方的推荐方式,推荐使用composer方式安装 TP5.1环境要求 PHP >= 5.6.0 PDO PHP Extension MBstring PHP Extens ...

  8. 8.1.3 Row对象

    假设数据以下面的方式创建并插入数据: import sqlite3 conn = sqlite3.connect(r'D:\test.db') c = conn.cursor() c.execute( ...

  9. 我的ArcGis9.3 到Arcgis10.0 升级步骤

    因为之前一直安装的是Arcgis 9.3 版本,领导发了个10.0版本说,该升级了,结果就开始了漫漫的升级路. 个人操作过程,只是个别. 一.卸载Arcgis9.3 这个过程真说是艰辛啊. 首先,卸载 ...

  10. 【codeforces 765E】Tree Folding

    [题目链接]:http://codeforces.com/problemset/problem/765/E [题意] 给你一棵树; 可以把一个节点的两条相同长度的链合并成一条链; 且这两条相同长度的链 ...