hdu 3555 Bomb(数位DP)
2014-02-04 22:49
537 查看
题意:求1~n中包含49的数的个数。
思路:简单数位DP。。。还是一个二进制数表示前一位是否是4和前面是否出现过49。
代码:
思路:简单数位DP。。。还是一个二进制数表示前一位是否是4和前面是否出现过49。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<map> #include<queue> #include<set> #include<stack> #include<cmath> #include<vector> #define inf 0x3f3f3f3f #define Inf 0x3FFFFFFFFFFFFFFFLL #define eps 1e-9 #define pi acos(-1.0) using namespace std; typedef long long ll; ll dp[64][4]; int num[64]; ll f(int pos,int st,bool limit) { if(pos==-1) return (st&2)>>1; if(!limit&&dp[pos][st]!=-1) return dp[pos][st]; int last=limit?num[pos]:9; int sn; ll ans=0; for(int i=0;i<=last;++i) { if(i==4) sn=(st|1); else if(i==9) sn=((st&1)<<1)|(st&2); else sn=(st&2); ans+=f(pos-1,sn,limit&&i==last); } if(!limit) dp[pos][st]=ans; return ans; } ll cal(ll x) { int len=0; while(x) { num[len++]=x%10; x/=10; } return f(len-1,0,true); } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); memset(dp,0xff,sizeof(dp)); ll n; int t; cin>>t; while(t--) { cin>>n; cout<<cal(n)<<endl; } return 0; }
相关文章推荐
- 推荐几本学习之外的书
- lex+yacc 构造语法树(二)
- Leetcode: Reverse Nodes in k-Group
- QTP/UFT 11中EmbedScript 和 RunScript 的区别
- Android 使用WakeLock
- Android 使用WakeLock
- linux 并发控制总结
- C++运算符重载需要注意的地方
- vs2010调试记录
- post Order Tree traverse - finally AC
- QTP汇总比较有价值的脚本
- svg学习(二)
- C#通用JSON操作类
- c++之内存管理
- 递推--超级台阶
- svg学习(一)
- codeforces 228 div2
- OCP-1Z0-053-200题-157题-105
- 黑马程序员_基础加强_JDK1.5新特性
- C#实现邮件发送