题目链接:

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. ABP生成错误:必须添加对程序集“netstandard”的引用

    当前使用ABP版本为:4.6.0 升级vs2017到15.4版本,升级framework到4.7版本 如果Core版本请升级到net core 2

  2. (Entity framework 应用篇)把权限判断封装在数据库访问层

    这里,我只是以一个例子,说一下简单权限控制,通过这个例子,大家可以设计庞大的权限管理层,把权限控制封装到数据库访问层,这样程序员就不用再写权限判断的代码了 首先,先看看我数据库DBContext的定义 ...

  3. [数据结构】【c语言】链表的创建和遍历

    第一次写代码的博客,一个刚刚接触的新手,来这里主要是为了记录自己,方便自己以后浏览,也欢迎大家指正.先来个简单的,动态链表的创建和遍历. #include<stdio.h> #includ ...

  4. MySQL(端口3306)

    MySQL(二进制)安装: 下载地址:http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.49-linux2.6-x86_64.tar.gz ...

  5. LINQ简记(3):子句

    LINQ查询表达式的子句如select,where,from等都是比较简单的子句,相信各位多练习练习,再结合MSDN的例子,基本上是可以理解的,因此,本文只挑几个有代表性的,以及有些难理解的子句来简述 ...

  6. 小白神器 - Django - 起步

    小白神器 - Django - 起步 一.  Django下载 1. 命令行 pip install django==1.11.16 pip install django==1.11.16 -i ht ...

  7. 【Codeforces 467C】George and Job

    [链接] 我是链接,点我呀:) [题意] 让你从1..n这n个数字中 选出来k个不相交的长度为m的区间 然后这个k个区间的和最大 求出这k个区间的和的最大值 [题解] 设dp[i][j]表示前i个数字 ...

  8. Maven学习总结(3)——使用Maven构建项目

    Maven学习总结(三)--使用Maven构建项目 maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项目的过程. 一.构建Jave项目 1.1.创建J ...

  9. Restful传递数组参数的两种方式

    第一种,直接传递数组 js直接传递数组 var data = ["123","456"];that.loadDictionarys(data).subscrib ...

  10. iOS学习笔记18-CoreData你懂的

    一.CoreData介绍 CoreData是iOS5之后新出来的的一个框架, 是对SQLite进行一层封装升级后的一种数据持久化方式. 它提供了对象<-->关系映射的功能,即能够将OC对象 ...