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. SQL SERVER-安装和卸载

    卸载后无法正常安装SQL SERVER 删除了本机的SQL SERVER以后,我发现我本机的SQL SERVER 再也安装不上了,这个一个比较严重的问题,要每天定时备份数据库到指定的地方才能防止数据丢 ...

  2. 在对Activity基类的封装中,我做了什么

    在开发实践中,不同Activity有很多代码是反复冗余的.因此非常有必要将这部分抽取出来.封装一个继承自Activity的类,命名为BaseActivity. 翻看之前写过的代码,起初,BaseAct ...

  3. iOS 开发仿网易云音乐歌词海报

    使用网易云音乐也是一个巧合,我之前一直使用QQ音乐听歌,前几天下 app 手机内存告急.于是就把QQ音乐给卸载掉了,正好晚上朋友圈里有一个朋友用网易云音乐分享了一首歌曲,于是我也就尝试下载了网易云音乐 ...

  4. [Angular] Read Custom HTTP Headers Sent by the Server in Angular

    By default the response body doesn’t contain all the data that might be needed in your app. Your ser ...

  5. android学习笔记(5)Activity生命周期学习

    每一个activity都有它的生命周期,开启它,关闭它,跳转到其他activity等等,都会自己主动调用下面某种方法.对这些个方法覆写后观察学习. protected void onCreate(Bu ...

  6. Spoj 1557 Can you answer these queries II 线段树 随意区间最大子段和 不反复数字

    题目链接:点击打开链接 每一个点都是最大值,把一整个序列和都压缩在一个点里. 1.普通的区间求和就是维护2个值,区间和Sum和延迟标志Lazy 2.Old 是该区间里出现过最大的Sum, Oldlaz ...

  7. 设计模式入门之代理模式Proxy

    //代理模式定义:为其它对象提供一种代理以控制对这个对象的訪问 //实例:鉴于书中给出的样例不太好.并且有些疑问,所以直接用保护代理作为实例 //要求,一旦订单被创建,仅仅有订单的创建人才干够改动订单 ...

  8. chrome控制台常用技巧有哪些

    chrome控制台常用技巧有哪些 一.总结 一句话总结:别的里面支持的快捷键,chrome里面几乎都支持,比如sublime中的ctrl+d,其实真是一通百通,都差不多的 1.chrome如何快速切换 ...

  9. nyoj--8--一种排序(排序,水题)

    一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数:现 ...

  10. 蛋白质GO信息的一些数据库

    最近用到蛋白质序列数据,但是才发现蛋白质的编号主要分为两种:一种是ENSP开头,主要是在ensembl数据库查询asia.ensembl.org/Human/Search:而另一种是uniprot.w ...