动态规划学习系列——数位DP(练手二)
2015-07-22 01:05
218 查看
题目链接:BZOJ 1833
解题思路:
非常常规的一道数位DP题目,然而,因为好久没做过题,结果怒调了三个钟。关键的地方在于数字0的处理,我采用的做法是先不考虑特殊的0,处理完别的数字之后,使用直接推公式的方法直接求得0的个数。注意数据范围,得使用long long。
代码:
解题思路:
非常常规的一道数位DP题目,然而,因为好久没做过题,结果怒调了三个钟。关键的地方在于数字0的处理,我采用的做法是先不考虑特殊的0,处理完别的数字之后,使用直接推公式的方法直接求得0的个数。注意数据范围,得使用long long。
代码:
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; long long dp[20][15][15],tmp[20],cnt,ans[15],ans1[15]; void cal(long long num) { memset(tmp,0,sizeof(tmp)); cnt=0; while(num) { tmp[cnt++]=num%10; num/=10; } } void sol(long long n) { cal(n); memset(dp,0,sizeof(dp)); for(int i=0;i<10;i++) dp[1][i][i]=1; for(int i=2;i<=cnt;i++) for(int j=0;j<10;j++) { for(int k=0;k<10;k++) for(int l=0;l<10;l++) dp[i][j][l]+=dp[i-1][k][l]; dp[i][j][j]+=(long long)(pow(10,i-1)+0.5); } } void solve(long long a,long long b) { memset(ans,0,sizeof(ans)); memset(ans1,0,sizeof(ans1)); sol(b); for(int i=cnt-1;i>=0;i--) { for(int j=0;j<tmp[i];j++) for(int k=0;k<10;k++) ans[k]+=dp[i+1][j][k]; if(i>0) { for(int j=cnt-1;j>=i;j--) ans[tmp[j]]+=tmp[i-1]*((long long)(pow(10,i-1)+0.5)); } } for(int i=0;i<cnt;i++) ans[tmp[i]]++; ans[0]=0; for(long long i=1;i<=b;i*=10) { ans[0]+=b/(i*10)*i; if(b%(i*10)/i==0) ans[0]-=(i-b%i-1); } //同前半段 sol(a); for(int i=cnt-1;i>=0;i--) { for(int j=0;j<tmp[i];j++) for(int k=0;k<10;k++) ans1[k]+=dp[i+1][j][k]; if(i>0) { for(int j=cnt-1;j>=i;j--) ans1[tmp[j]]+=tmp[i-1]*((long long)(pow(10,i-1)+0.5)); } } for(int i=0;i<cnt;i++) ans1[tmp[i]]++; ans1[0]=0; for(long long i=1;i<=a;i*=10) { ans1[0]+=a/(i*10)*i; if(a%(i*10)/i==0) ans1[0]-=(i-a%i-1); } for(int i=0;i<10;i++) ans[i]-=ans1[i]; } int main() { long long a,b; while(~scanf("%lld %lld",&a,&b)) { solve(a-1,b); printf("%lld",ans[0]); for(int i=1;i<10;i++) printf(" %lld",ans[i]); printf("\n"); } return 0; }
相关文章推荐
- css3制作导航栏
- Linux下5种IO模型的小结
- VS2015
- 安装OpenStack前CentOS7网络基本配置
- JAVA线程中ThreadLocal和volatile的说明
- HDU5289
- Simple JavaScript Inheritance--一个极简JS面向对象-类库
- 动态规划求解最大字段和及其变种问题
- 带你看懂Dictionary的内部实现
- 将一些文档(.zip,.txt,.pdf)进行流处理,存储到mysql中blob字段中
- ssh
- 高速IC下方能否布线还是应该保留完整局部地平面
- 触发器
- [第1章]数据:NSUserDefaults的使用
- python系列------函数类型--os函数库
- 由多个电容组成的去耦旁路电路,电容怎么布局摆放,先大后小还是先小后大?
- CSS BFC学习笔记
- java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(2)
- 【OpenGL】“我叫MT”纯手工3D动画制作之2——建立模型
- Android的按钮单击事件及监听器的实现方式