hdu 1633 数位DP 好题
来源:互联网 发布:安卓黑科技软件网站 编辑:程序博客网 时间:2024/05/17 07:49
数位DP, 仍然使用前面提到过的模板 (之前的文章《数位DP题目汇总》:http://blog.csdn.net/techmonster/article/details/50284375)
但是在细节上还是有比较多差别。
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define MS(x,y) memset(x,y,sizeof(x))#define pi acos(-1.0)using namespace std;void fre(){freopen("t.txt","r",stdin);}typedef long long LL;typedef unsigned long long ULL;const int MOD = 1e9 + 7;const int inf = (1<<63)-1;const int MAXN = 4*(1e5)+1;const double eps = -(1<<30);int dp[10][10],pow10[10],digit[10],num[10],zero[10],flag[10];// digit储存数字的每一位,num[i]储存数字的前i位,具体看下面。dp[i][j]表示i位数 (包含前导0,如0004),数字j的个数void init()//初始化 10的幂 和 zero。zero[i]表示i位数中要去掉的0的个数。如:000011 这里面的0也都被算进去了。{ int i,j; pow10[0] = 1; zero[0] = 0; zero[1] = 1; for(i = 1; i < 9; ++i) pow10[i] = pow10[i-1]*10; for(i = 2; i < 9; ++i) zero[i] = zero[i-1]+ pow10[i-1]; //zero也使用递推的方法求得,十分巧妙。}void dfs(int len,int f)//数位DP模板,f代表是否有上界。{ if(len == 0) return;//len ==0 为搜索结束 if(!f&&flag[len]) return;//如果之前已经储存则直接使用。 注意到,当搜索到上界时,我们直接在dp上做修改,这样使dp[i]不再是完整i位数的正确值,这样下次调用不就出错了吗? 事实上,当搜索到上界时,dp[i]就不再会被用到,因此直接破坏也无妨。 flag[len] = 1; MS(dp[len],0);//这步千万不能漏,到上界时,要清零。 int i,j,top = f?digit[len]:9; for(i = 0; i <= top; ++i) { dfs(len-1,f&&i==top); for(j = 0; j <= 9; ++j) { dp[len][j] += dp[len-1][j]; } if(f&&i==top) dp[len][i] += num[len-1]+1; //对于数字124,1领导的数字1** 有25个,因此 1的数量加25 else dp[len][i] += pow10[len-1];//和上面一样,不过这个是没到上界的情况。 }}void solve(int x,int* ans){ MS(flag,0); MS(dp,0); int i,j,len = 0; num[0] = 0; while(x) { digit[++len] = x%10; num[len] = digit[len]*pow10[len-1] + num[len-1]; x/=10; } dfs(len,1); for(i = 0; i <= 9; ++i) { ans[i] = dp[len][i]; } ans[0] -= zero[len];//关键步骤!!减去前导0}int main(){ // fre(); int i,a,b,ans1[10],ans2[10]; init(); while(~scanf("%d%d",&a,&b)) { if(a== 0 && b==0) break; if(a>b) {int t = a; a = b; b = t;} solve(a-1,ans1); solve(b,ans2); printf("%d",ans2[0]-ans1[0]); for(i = 1; i <= 9; ++i) { printf(" %d",ans2[i]-ans1[i]); } puts(""); }}
0 0
- hdu 1633 数位DP 好题
- hdu 3943 经典数位dp好题
- hdu 4507 数位dp(好题)
- [HDU]4507 恨7不成妻 数位Dp好题
- cf 55D 数位dp 好题
- poj 3971 Scales (数位dp,好题)
- hihocoder1033-数位dp&数位求和&好题-交错和
- HDU - 3709 Balanced Number (数位DP&记忆化dfs)好题
- HDU - 4352 XHXJ's LIS (数位DP&记忆化dfs&位运算)好题
- 数位DP 第一题 hdu 2089
- hdu 2089 数位dp模板题
- hdu 3555 数位dp模板题
- hdu 4722 数位dp 简单题
- hdu 2089 数位dp入门题
- hdu 3555数位dp基础入门题
- hdu 3555数位DP 入门题
- hdu 2089(数位DP模板题)
- HDU 2089 数位DP 入门题
- JS产生随机数的几个用法!
- iOS最全面试题及答案
- java的File机制实现目录下的文件检索
- 用Matplotlib绘制股票每月最高收盘价曲线
- 数组中有字典的排序
- hdu 1633 数位DP 好题
- android选择图片得到实际路径的总结
- proto-lua-gen 转换proto文件错误 Expected top-level statement <e.g ."message">.
- 用mount挂载远程Windows共享文件夹进行文件拷贝的方法
- Unity日志工具——封装,跳转
- 数据类型的范围
- 初写博文
- Python+Hadoop Streaming实现MapReduce(如何给map和reduce的脚本传递参数)
- 人脸检测资源收集