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 ...
随机推荐
- 微服务的一种开源实现方式——dubbo+zookeeper
转自: http://blog.csdn.NET/zhdd99/article/details/52263609 微服务架构成了当下的技术热点,实现微服务是要付出很大成本的,但也许是因为微服务的优点太 ...
- antiSMASH数据库:微生物次生代谢物合成基因组簇查询和预测
2017年4月28日,核酸研究(Nucleic Acids Research)杂志上,在线公布了一个可搜索微生物次生代谢物合成基因组簇的综合性数据库antiSMASH数据库 4.0版,前3版年均引用2 ...
- c#中动态创建textbox并且从数据库中获取表中数据添加到textbox中
private void FormLugOther_Load(object sender, EventArgs e) { foreach (string str in FormLug.FieldLis ...
- CentOS6.9下NFS配置说明(转载)
NFS是Network File System的缩写,即网络文件系统.它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录.NFS客户端可以通过挂载(mount)的方式将NFS ...
- react typescript 父组件调用子组件
//父组件import * as React from 'react'import { Input } from 'antd'const Search = Input.Searchimport &qu ...
- [C#] DataTable 操作汇总(持续更新)
1.DataTable 分组操作 var grow = dt.Select().GroupBy((row1) => { return new { //分组的字段 fieldA = row1[&q ...
- 强悍的 ubuntu —— 命令行访问网页
所谓以命令行的方式访问网页,即是在终端下以文本的形式访问网站,这里推荐一个工具:w3m, $ sudo apt-get install w3m $ w3m www.baidu.com
- css的基本操作学习--css样式,选择器,hover,文字属性,文本属性,背景
什么是css? 通配符选择器 <head> /* *通配符选择器 匹配任何元素 */ *{ margin: 0; padding: 0; } </head> css样式有三种 ...
- 牛刀小试MySQL学习—MySQL 双主
双主其实说白了也是一个replication,只是推出一些新的拓扑结构 主-主的复制有两种模式: 主动-主动模式下的主-主复制(Master-Master in Active-Active Mod ...
- 洛谷 1373 dp 小a和uim之大逃离 良心题解
洛谷 1373 dp 这题还不算太难,,当初看的时候不是很理解题意,以为他们会选择两条不同的路径,导致整体思路混乱 传送门 其实理解题意和思路之后还是敲了不短的时间,一部分身体原因再加上中午休息不太好 ...