lightoj 1140 - How Many Zeroes? 数位DP
2016-03-30 16:50
357 查看
问[a,b]之间有多少个0..
应该属于简单数位DP,考虑的应该是如果没有非0元素出现的话不能加0...除非是0
那么多加一个变量就好了。
还有输入是32位无符号整数,我用Int一直过不了样例..真是..
本来我dp数组只开了一维发现总是少状态多加了一维...
难道我做数位DP少开一维是天赋误导技能么
应该属于简单数位DP,考虑的应该是如果没有非0元素出现的话不能加0...除非是0
那么多加一个变量就好了。
还有输入是32位无符号整数,我用Int一直过不了样例..真是..
本来我dp数组只开了一维发现总是少状态多加了一维...
难道我做数位DP少开一维是天赋误导技能么
#include<bits/stdc++.h> using namespace std; #define ll long long #define mod 1000000007 #define inf 0x3f3f3f3f ll dp[20][20]; int num[20]; ll dfs(int site,int d,int flag,int f) { if(site==0) return !flag?(ll)1:(ll)d; if(!f&&flag&&dp[site][d]!=-1) return dp[site][d]; int len=f?num[site]:9; ll ans=0; for(int i=0; i<=len; i++) { if(i==0) { if(flag) ans+=dfs(site-1,d+1,flag,f&&i==len); else ans+=dfs(site-1,d,0,f&&i==len); } else ans+=dfs(site-1,d,1,f&&i==len); } if(!f&&flag) dp[site][d]=ans; return ans; } ll solve(ll x) { if(x<0) return 0; int i=0; while(x) { num[++i]=x%10; x/=10; } return dfs(i,0,0,1); } int main() { int t; scanf("%d",&t); memset(dp,-1,sizeof(dp)); for(int cas=1; cas<=t; cas++) { ll a,b; scanf("%lld %lld",&a,&b); printf("Case %d: %lld\n",cas,solve(b)-solve(a-1)); } return 0; }
相关文章推荐
- 水洼
- 水池数目
- Realm实战总结---Android
- 硬盘管理心得
- 使用delphi+intraweb进行微信开发5—准备实现微信API,先从获取AccessToken开始
- 虚拟机linux 挂载windows共享目录 给linux的nginx服务器使用
- poj3294 --Life Forms
- JAVA中循环删除list中元素的方法总结
- C3P0数据库连接池的使用工具和使用数据库连接池来进行查询操作
- struts拦截器心得
- gdb+gdbserver调试arm-linux程序
- JavaScript资料收集
- Chapter 13:Understanding HTML&Assignment
- NSLog 字符含义
- Hero In Maze 台州oj
- 程序开发心理学第三篇
- tyvj 1463 智商问题
- Java 集合类整理
- 置位比特位置查找java
- 最短路 51Nod1693 水群