【BZOJ1026】【SCOI2009】windy数 数位DP
2015-06-10 20:53
453 查看
链接:
#include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/46446473"); }
题解:
f(i,j)f(i,j) 表示最高 ii 位,此位为 jj ,的方案数。注意此数组存在前导零,比如 f(i,0)f(i,0) 。
f(i,j)f(i,j) 从 f(i−1,k)f(i-1,k) 随便转移。
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 15 using namespace std; long long f ,g ; int long get(int x,int d,long long t,int c=-1) { if(d==1) { int ret=0; for(int i=0;i<=x;i++)if(abs(i-c)>=2) ret++; return ret; } int i,ret=0; for(i=0;i<x/t;i++)if(abs(i-c)>=2) ret+=f[d][i]; if(abs(x/t-c)<2)return ret; return ret+get(x%t,d-1,t/10,x/t); } int main() { // freopen("test.in","r",stdin); int i,j,k; int a,b,c; for(i=0;i<10;i++)f[1][i]=1; for(i=1;i<10;i++)for(j=0;j<10;j++) for(k=0;k<10;k++)if(abs(j-k)>=2) f[i+1][k]+=f[i][j]; for(g[0]=i=1;i<=10;i++) { g[i]=g[i-1]; for(j=1;j<10;j++)g[i]+=f[i-1][j]; } int l,r; scanf("%d%d",&l,&r),l--; long long dl=1,tl=1; while(tl*10<=l)tl*=10,dl++; long long dr=1,tr=1; while(tr*10<=r)tr*=10,dr++; int ans=g[dr]-g[dl]; if(r)ans+=get(r,dr,tr,dr==1?233:-1); if(l)ans-=get(l,dl,tl,dl==1?233:-1); printf("%d\n",ans); return 0; }
相关文章推荐
- lab4 Cache Geometries 深入理解计算机系统——高速缓存
- 微软100题(75)二叉树最低公共父节点
- Python 显示LinkedIn用户作业
- HDU 4287 Intelligent IME (字典树 && map)
- 解决Item控件抢占焦点
- 树莓派玩转WIN10之安装篇
- 关于MVC中Layout母版页文件
- 输入法框架
- MDT 2013 从入门到精通之自动化部署Windows 8.1
- MDT 2013 从入门到精通之自动化部署Windows 8.1
- 文本过滤
- simple login(Pwnable.kr)
- php mysql 由于目标计算机积极拒绝,无法连接 错误原因
- Android之Action Bar
- 奇葩念头:微信能取代WP应用吗
- thinkphp_3.2.3实现 Rewrite 模式的配置方法
- Java中entity(实体类)的写法规范
- 打磨程序员的专属利器——快捷键
- JAVA课程实验报告 实验五 Java网络编程及安全
- constant中的initTexture