1026: [SCOI2009]windy数

题目:传送门

题解:

   其实之前年少无知的时候好像A过...表示当时并不知道什么数位DP

   今天回来深造一发...

   其实如果对这个算法稍有了解...看到这题的数据范围应该就YY出来了(蒟蒻博主表示很无力)

   好吧讲做法:

   这题的DP其实只是在于一开始的预处理:定义f[i][j]表示长度为i且最高位为j的windy数

   那么转移方程再YY一发:

  1 for(int i=;i<=;i++)f[][i]=;
   for(int i=;i<=;i++)
   for(int j=;j<=;j++)
   for(int k=;k<=;k++)
   if(abs(j-k)>=)
   f[i][j]+=f[i-][k];

   之后就是怎么利用这个f数组了,一个常规套路:

   对于区间[a,b]的答案,如果我们可以求出1~b的答案和1~a-1的答案,那么输出[1~b]-[1~a-1]就是答案了啊。。

   那么我的做法是用一个getsum函数,求出1~n-1的答案,最后两个区间相减就ok

   具体看代码:

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define qread(x) x=read()
using namespace std;
inline int read()
{
int f=,x=;char ch;
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return f*x;
}
int A,B;
int f[][];//长度为i,最高位为j
int w[];
int getsum(int n)//求区间1~n-1的答案
{
int len=,ans=;
memset(w,,sizeof(w));
while(n!=)
{
w[++len]=n%;
n/=;
}
for(int i=;i<len;i++)//比自己至少小一位
for(int j=;j<=;j++)//枚举开头(所以不能为‘0’)
ans+=f[i][j];
for(int i=;i<w[len];i++)//和自己同样位数,但是最高位比自己小
ans+=f[len][i];
for(int i=len-;i>=;i--)//最高位一样
{
for(int j=;j<w[i];j++)
{
if(abs(j-w[i+])>=)
ans+=f[i][j];
}
if(abs(w[i+]-w[i])<)
break;
}
return ans;
}
int main()
{
qread(A);qread(B);if(A>B)swap(A,B);
for(int i=;i<=;i++)f[][i]=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
for(int k=;k<=;k++)
if(abs(j-k)>=)
f[i][j]+=f[i-][k];
int ans1=getsum(B+);
int ans2=getsum(A);
//因为getsum求的是1~n-1这个区间的答案,所以我们输出getsum(B+1)-getsum(A);
printf("%d\n",ans1-ans2);
return ;
}

bzoj1026: [SCOI2009]windy数(传说你是数位DP)的更多相关文章

  1. BZOJ1026 SCOI2009 windy数 【数位DP】

    BZOJ1026 SCOI2009 windy数 Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B ...

  2. bzoj1026: [SCOI2009]windy数(数位dp)

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

  3. 2018.06.30 BZOJ1026: [SCOI2009]windy数(数位dp)

    1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两 ...

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

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

  5. 【数位DP】bzoj1026: [SCOI2009]windy数

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

  6. bzoj千题计划117:bzoj1026: [SCOI2009]windy数

    http://www.lydsy.com/JudgeOnline/problem.php?id=1026 数位DP 如果前一位填的是0, 0是前导0,下一位可以随便填 0不是前导0,下一位不能填1 为 ...

  7. [bzoj1026][SCOI2009]windy数_数位dp

    windy数 bzoj-1026 题目大意:求一段区间中的windy数个数. 注释:如果一个数任意相邻两位的差的绝对值都不小于2,这个数就是windy数,没有前导0.$区间边界<=2\cdot ...

  8. [BZOJ1026][SCOI2009]windy数 解题报告|数位dp

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

  9. [bzoj1026][SCOI2009]windy数——数位dp

    题目 求[a,b]中的windy数个数. windy数指的是任意相邻两个数位上的数至少相差2的数,比如135是,134不是. 题解 感觉这个题比刚才做的那个简单多了...这个才真的应该是数位dp入门题 ...

随机推荐

  1. java源码之List(ArrayList,LinkList,Vertor)

    1,List概括 List的框架图 (01) List 是一个接口,它继承于Collection的接口.它代表着有序的队列. (02) AbstractList 是一个抽象类,它继承于Abstract ...

  2. struts2请求过程源代码分析

    struts2请求过程源代码分析 Struts2是Struts社区和WebWork社区的共同成果.我们甚至能够说,Struts2是WebWork的升级版.他採用的正是WebWork的核心,所以.Str ...

  3. JAVA设计模式之【命令模式】

    命令模式 为了降低耦合度,将请求的发送者和接收者解耦 发送请求的对象只需要哦知道如何发送请求,而不必知道如何完成请求 对请求排队 记录请求日志 支持撤销操作 核心在于引入命令类 角色 抽象命令类Com ...

  4. iOS开发之UIAlertController的适配

    在iOS8中,只能用UIAlertController.而原来的UIAlertView及UIActionSheet已经被抛弃掉了.但是如果一台iOS 7 的手机运行到有UIAlertControlle ...

  5. Linux就该这么学 20181005(第八章防火墙)

    参考链接https://www.linuxprobe.com/ vim /etc/sysconfig/network-scripts/ifcfg-ens32 网络配置0 nmtui 网络配置1 nm- ...

  6. Sql Server 2012数据库的安装【自己一点一点敲的】

    Sql Server 2012数据库的安装 1.到微软官网上下载 下载链接为:https://www.microsoft.com/zh-cn/download/details.aspx?id=2906 ...

  7. jquery简介 each遍历 prop attr

    一.JQ简介 jQuery是一个快速.简洁的JavaScript框架,它封装了JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动画设计和 ...

  8. Android 那些年,处理getActivity()为null的日子

    在日常开发中的时候,我们经常会使用ViewPager+Fragment进行视图滑动,在某些部分逻辑也许我们需要利用上下文Context(例如基本的Toast),但是由于Fragment只是衣服在Act ...

  9. PostgreSQL 数据库性能调优的注意点

    PostgreSQL提供了一些性能调优的功能.主要有如下几个方面.1.使用EXPLAIN   EXPLAIN命令可以查看执行计划,这个方法是我们最主要的调试工具. 2.及时更新执行计划中使用的统计信息 ...

  10. intellij idea 15 for mac破解版(含注册码)下载

    转载 https://blog.csdn.net/dataiyangu/article/details/81163118