题目链接:BZOJ - 1026

题目分析

这道题是一道数位DP的基础题,对于完全不会数位DP的我来说也是难题..

对于询问 [a,b] 的区间的答案,我们对询问进行差分,求 [0,b] - [0,a-1] 的答案。这样就化繁为简了。

具体过程见代码中的注释。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std; const int MaxBit = 13; int A, B;
int f[MaxBit][11], Bit[MaxBit]; inline int Abs(int a) {
return a >= 0 ? a : -a;
} //计算小于x的数的答案
int Get(int x) {
if (x == 0) return 0;
int ret = 0, l = 0;
while (x) {
Bit[++l] = x % 10;
x /= 10;
}
//统计位数不足l位的答案
for (int i = 1; i <= l - 1; ++i) {
for (int j = 1; j <= 9; ++j) {
ret += f[i][j];
}
}
//最高位可以在[1, Bit[l]-1]之间变化
for (int i = 1; i <= Bit[l] - 1; ++i) ret += f[l][i];
//固定后面的(l-i)位,然后第i位可以在[0, Bit[i]-1]之间变化
for (int i = l - 1; i >= 1; --i) {
for (int j = 0; j <= Bit[i] - 1; ++j) {
if (Abs(j - Bit[i + 1]) >= 2) ret += f[i][j];
}
//无法固定第i位
if (Abs(Bit[i + 1] - Bit[i]) < 2) break;
}
return ret;
} int main()
{
//f[i][j]表示第i位是j的答案数
for (int i = 0; i <= 9; ++i) f[1][i] = 1;
for (int i = 1; i <= 10; ++i) {
for (int j = 0; j <= 9; ++j) {
for (int k = 0; k <= 9; ++k) {
if (Abs(k - j) >= 2) f[i][j] += f[i - 1][k];
}
}
}
scanf("%d%d", &A, &B);
//对询问进行差分,化繁为简
printf("%d\n", Get(B + 1) - Get(A));
return 0;
}

  

[BZOJ 1026] [SCOI 2009] Windy数 【数位DP】的更多相关文章

  1. bzoj 1026 [SCOI2009]windy数 数位dp

    1026: [SCOI2009]windy数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...

  2. bzoj 1026 [ SCOI2009 ] windy数 —— 数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 蛮简单的数位DP,预处理 f[i][j] 表示 i 位数,以 j 开头的 windy ...

  3. bzoj 1026: [SCOI2009]windy数 & 数位DP算法笔记

    数位DP入门题之一 也是我所做的第一道数位DP题目 (其实很久以前就遇到过 感觉实现太难没写) 数位DP题目貌似多半是问从L到R内有多少个数满足某些限制条件 只要出题人不刻意去卡多一个$log$什么的 ...

  4. bzoj 1026 [SCOI2009]windy数——数位dp水题

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 迷恋上用dfs写数位dp了. #include<iostream> #in ...

  5. BZOJ 1016 Windy 数 | 数位DP

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=1026 题解: f[i][j][1/0]表示枚举到第i位,这位开头是j,当前的数大于(1)或小 ...

  6. 【BZOJ-1026】windy数 数位DP

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5230  Solved: 2353[Submit][Sta ...

  7. 【BZOJ 1026】 [SCOI2009]windy数

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1026 [题意] [题解] 数位Dp 设f[i][j]表示长度为i,第一位(也就是最高位 ...

  8. BZOJ1026: [SCOI2009]windy数[数位DP]

    1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 6346  Solved: 2831[Submit][Sta ...

  9. 【BZOJ 1026】 [SCOI2009]windy数

    Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? In ...

随机推荐

  1. poj3252 Round Numbers

    Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7625   Accepted: 2625 Des ...

  2. MS SQL 性能优化

    http://blog.csdn.net/dba_huangzj/article/details/50455543

  3. 『零行代码』解决键盘遮挡问题(iOS)

    关注仓库,及时获得更新:iOS-Source-Code-Analyze https://github.com/draveness/iOS-Source-Code-Analyze Follow: Dra ...

  4. Restart-ServiceEx.psm1

    详细描述 利用WMI的Win32_Service类重启指定计算机上的服务. Restart-ServiceEx cmdlet 通过WMI的Win32_Service类向指定计算机(ComputerNa ...

  5. QT Windows下生成动态链接库

    目标:需要将一个QT程序生成动态链接库 Windows环境下Qt生成的共享库文件其后缀为dll,可以在程序运行过程中动态加载 新建项目,选择库 选择共享库 建立好项目后生成三个文件,两个.h一个.cp ...

  6. rabbitmq 消息持久化之receive and send

    二: 任务分发 &消息持久化   启用多个接收端的时候如果某一个receive 关闭要保证消息有反馈是否收到   send端 #-*- coding: UTF-8 -*-import pika ...

  7. Http,Https (SSL)的Url绝对路径,相对路径解决方案Security Switch 4.2 中文帮助文档 分类: ASP.NET 2014-10-28 14:09 177人阅读 评论(1) 收藏

    下载地址1:https://securityswitch.googlecode.com/files/SecuritySwitch%20v4.2.0.0%20-%20Binary.zip 下载地址2:h ...

  8. mvc4+jquerymobile页面加载时无法绑定事件

    问题:在view里写js,在页面第一次加载完成后,无法触发事件, 如:按钮click事件,已经在$(function(){  添加了click });但就是无法触发,必须刷新下才可以. 原因分析: 主 ...

  9. JavaScript核心

    JavaScript核心 arguments对象 Array对象 Boolean对象 Date对象 Error对象 Function对象 Global对象 Math对象 Number对象 Object ...

  10. Activity间的跳转,startActivity与startActivityForResult

    JreduCh04 2016-07-30跳转 (由一个画面跳转到另一个画面)两种方法:Intent中 startActivity.startActivityForResult.后者可设置request ...