BZOJ 1833
2016-03-14 21:16
330 查看
最近新学了数位DP,bzoj1833是不错的练手入门题。
这题难度适中,有人可能会被a和b较大的值吓到,其实用数位DP是容易的。
用f[i][j][k]表示到有i位数,首位为j,数码k的个数。
可以先初始化好一张这样的表,然后读入时操作一下就好了,自己yy一下就好。
代码:
这题难度适中,有人可能会被a和b较大的值吓到,其实用数位DP是容易的。
用f[i][j][k]表示到有i位数,首位为j,数码k的个数。
可以先初始化好一张这样的表,然后读入时操作一下就好了,自己yy一下就好。
代码:
/************************************************************** Problem: 1833 User: fantasticwtl Language: C++ Result: Accepted Time:0 ms Memory:1300 kb ****************************************************************/ #include <iostream> #include <cmath> #include <algorithm> using namespace std; unsigned long long a,b,f[21][10][10]; unsigned long long sol (unsigned long long x,int y) { int len=0,wz[21]= {0}; unsigned long long ans=0,g=x-1; while(x)wz[++len]=x%10,x/=10; for(int i=1; i<len; i++) for(int j=1; j<=9; j++)ans+=f[i][j][y]; for(int j=1; j<wz[len]; j++)ans+=f[len][j][y]; for(int i=len-1; i>=1; i--) { for(int j=0; j<wz[i]; j++)ans+=f[i][j][y]; if(wz[i+1]==y)ans+=g-(1ll*pow(10,i)*y)+1; g-=1ll*pow(10,i)*wz[i+1]; } return ans; } int main () { for(int i=0; i<=9; i++)f[1][i][i]=1; for(int i=2; i<=12; i++) for(int j=0; j<=9; j++) { for(int kk=0; kk<=9; kk++) for(int k=0; k<=9; k++)f[i][j][kk]+=f[i-1][k][kk]; f[i][j][j]+=pow(10,i-1); }//初始化f数组 cin>>a>>b;//读入 for(int i=0; i<=8; i++)cout<<(sol(b+1,i)-sol(a,i))<<' '; cout<<(sol(b+1,9)-sol(a,9))<<endl;//行末不能有空格,会PE }
相关文章推荐
- Valid Parentheses
- 二叉树java版
- 构建者模式
- Ubuntu下修改hosts文件
- 20135317的博客目录
- 静态内部类,成员内部类,外部类之间的一些知识总结
- 找出21位的水仙数
- Android中5大数据存储(一)---SharedPreferences存储
- 蛇形填数
- eclipse中搭建svn开发管理环境
- poj 1815 Friendship 最小割 拆点 输出字典序
- SpringMVC——hello SpringMVC
- 实验二 分支程序实验和循环程序实验
- 统计难题
- java实现走迷宫
- 关于VOID *在cl与gcc的不同(无意中发现)
- uva1583 Digit Generator && uva1584 Circular Sequence(水)
- CAS——概述
- Linux下查看cpuinfo相关信息注释
- java path classpath JAVA_HOME