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 ;
}

最新文章

  1. Oracle数据库该如何着手优化一个SQL
  2. WPF这样的界面应该如何编写呢?
  3. DSY2287*消失之物
  4. 【转】Effective-Objective-C-读书笔记-Item-4-如何正确定义常量 -- 不错
  5. 创建多模块maven项目
  6. ufldl学习笔记和编程作业:Feature Extraction Using Convolution,Pooling(卷积和汇集特征提取)
  7. TabbedPaneDemo
  8. vue-购物车
  9. Spring测试框架JUnit4.4 还蛮详细的
  10. 去除元素浮动(:after)
  11. Linux过滤错误日志
  12. ios开发之--tableview单选/多选实现(非tableview的editing状态)及默认选中
  13. Qt——元对象和属性机制
  14. Oracle 数据库创建(图形界面操作)
  15. Canny边缘检测原理及C#程序实现
  16. 显示器驱动程序 NVIDIA Windows Kernel Mode Driver Version 已停止响应 并且己成功恢复 解决方法
  17. Getsystime()与Getlocaltime()函数 相差8个小时
  18. websocket 和 dwr 做web端即时通信
  19. IDEA 自动生成serialVersionUID
  20. fork: retry: Resource temporarily unavailable

热门文章

  1. 2015 Multi-University Training Contest 1 hdu 5296 Annoying problem
  2. HDU 1521
  3. hunnu11544:小明的烦恼——找字符串
  4. ZOJ 3494 BCD Code (AC自己主动机 + 数位DP)
  5. node11---相册
  6. bzoj3295: [Cqoi2011]动态逆序对(cdq分治+树状数组)
  7. bzoj4519: [Cqoi2016]不同的最小割(分治最小割)
  8. zzuoj--10400--海岛争霸(并查集)
  9. angular4(2-1)angular脚手架引入第三方类库(jquery)
  10. .Net垃圾回收和大对象处理