SCOI2009 windy数
2015-09-12 21:41
232 查看
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1026
分析:lzr大神给我们讲的是3维的,从网上学了个2维的。自己写的也是错误百出。
代码:
分析:lzr大神给我们讲的是3维的,从网上学了个2维的。自己写的也是错误百出。
代码:
#include <cstdio> #include <algorithm> using namespace std; const long long int p[15]={0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000}; const int inf=0x3f3f3f; int A,B,f[15][10]; void dp() { int i,j,k; for(i=0;i<=9;i++) //i=0 f[1][i]=1; //f[1][i]=1; for(i=2;i<=9;i++) //i<=9 for(j=0;j<=9;j++) //j=0 for(k=0;k<=9;k++) if(abs(j-k)>=2) f[i][j]+=f[i-1][k]; for(j=1;j<=2;j++) for(k=0;k<=9;k++) if(abs(j-k)>=2) f[10][j]+=f[9][k]; return; } int work(int n) { int i,j,maxn=0,last,lastn,now; int ans=0; while(n>=p[maxn]) maxn++; maxn--; //处理位数小于n for(i=1;i<maxn;i++) for(j=1;j<=9;j++) ans+=f[i][j]; //处理位数相同 last=inf; lastn=n; for(i=maxn;i>=1;i--) { now=lastn/p[i]; if(maxn==i) j=1; else j=0; for(;j<now;j++) //j=0; if(abs(last-j)>=2) ans+=f[i][j]; if(abs(now-last)<2) break; lastn%=p[i]; last=now; } return ans; } int main() { scanf("%d%d",&A,&B); dp(); printf("%d",work(B+1)-work(A)); return 0; }
相关文章推荐
- HDU 5432 BC - Pyramid Split(二分 + 模拟)
- i++ i-- 问题小记
- 2015-09-09 [一点资讯]--数据抓取和处理工程师--5面
- 1.Objective-C基础学习
- Jq将页面值传至模态框的用法
- 网络性能测试工具iperf详细使用图文教程
- php添加mysql扩展
- 11.tftp和nfs服务器
- 窗口-CCF测试往届题
- 如何在Android模拟器上安装apk文件
- Hadoop/spark安装实战(系列篇3) Hadoop 伪分布模式安装
- 一个简单的jsp+servlet实例,实现简单的登录
- java练习:打印 数字1、2、3、4的组合,不能以4开头,1和3不能相邻,且数字不能重复
- shell script
- [vb.net]最简单的邮件发送
- php环境的搭建
- 样式表单位
- php添加socket的扩展
- 数据结构之---C语言实现连式多项式
- Multithreading and Grand Central Dispatch on iOS for Beginners Tutorial