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 ...
随机推荐
- 在Windows下安装Elasticsearch5.0
1.准备工作 安装和配置Java环境 2.下载 地址:https://www.elastic.co/downloads/elasticsearch 老版本:https://www.elastic.co ...
- 几种fullpage用法及demo
jQuery全屏滚动插件fullPage.js https://github.com/alvarotrigo/fullPage.js http://www.dowebok.com/77.html 全屏 ...
- jsTree使用记录
1. ajax请求生成jsTree <span style="font-size:14px;"><script> var r = []; // 权限树中被选 ...
- 把excel、txt当数据库来查询
Sub excel连接数据库() Dim Con As New ADODB.Connection Dim strCon, strsql As String Dim rs As ADODB.Record ...
- windows程序设为开机自启动
在Windows文件管理器中输入 %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup 把程序快捷方式放到此处即可.
- profiler-gpu分析记录
查看 Android 手机芯片信息下面以 夜神模拟器为例 D:\cmderλ adb devices # 1. 列出安卓设备List of devices attached127.0.0.1:6200 ...
- 图表实现基于SVG或Canvas
Highcharts 基于SVG,方便自己定制,但图表类型有限. Echarts 基于Canvas,适用于数据量比较大的情况. D3.v3 基于SVG,方便自己定制:D3.v4支持Canvas+SVG ...
- 洛谷——P1896 [SCOI2005]互不侵犯
P1896 [SCOI2005]互不侵犯 状压DP入门题 状压DP一般需要与处理状态是否合法,节省时间 设定状态dp[i][j][k]表示第i行第j个状态选择国王数为k的方案数 $dp[i][j][n ...
- NFA到DFA实例
下面图使用NFA表示的状态转换图, 使用子集构造法,有如下过程, ε-closure(0) = {0, 1, 2, 3, 4, 6, 7}初始值,令为AA = {0, 1, 2, 3, 4, 6, 7 ...
- PAT 1119 Pre- and Post-order Traversals
Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can ...