数位dp
来源:互联网 发布:企业网络组建毕业论文 编辑:程序博客网 时间:2024/05/01 10:16
//hdu2089
#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<cstdio>#include<string>#include<set>#include<map>#include<queue>#include<vector>#include<stack>using namespace std;#define ll long long#define cl(a,b) memset(a,b,sizeof(a))#define N 50005#define MAXN 100005int dp[10][3];//dp[i][0],表示不存在不吉利数字//dp[i][1],表示不存在不吉利数字,且最高位为2//dp[i][2],表示存在不吉利数字void init(){ cl(dp,0); dp[0][0]=1; for(int i=1;i<=6;i++) { dp[i][0]=dp[i-1][0]*9-dp[i-1][1];//把上一位不存在不吉利数字加上0~9除了4共9个,减去上一位是2 dp[i][1]=dp[i-1][0];//上一位不存在不吉利数字在在最高位加2 dp[i][2]=dp[i-1][2]*10+dp[i-1][1]+dp[i-1][0];//已经存在不吉利数字*10,不存在不吉利数字,且最高位为2加上一个6,,,不存在不吉利数字加上一个4 }}int solve(int n){ int l=0,bit[10]; int temp=n; while(n) { bit[++l]=n%10; n/=10; } bit[l+1]=0; int ans=0; bool flag=false; for(int i=l;i>0;i--) { ans+=dp[i-1][2]*bit[i]; if(flag) ans+=dp[i-1][0]*bit[i]; if(!flag&&bit[i]>4)//高位可能含有4 ans+=dp[i-1][0]; if(!flag&&bit[i+1]==6&&bit[i]>2)//高位含有6后一个出现2 ans+=dp[i][1]; if(!flag&&bit[i]>6)//高位可能出现6,要把后面最高位为2计入 ans+=dp[i-1][1]; if(bit[i]==4||(bit[i+1]==6&&bit[i]==2))flag=true; } //cout<<ans<<endl; return temp-ans;}int main(){ int n,m; init(); while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; printf("%d\n",solve(m+1)-solve(n)); } return 0;}
0 0
- 数位dp
- 数位DP
- 数位DP
- 数位dp
- 数位dp
- 数位dp
- 数位DP
- 数位dp
- 数位DP
- 【数位DP】
- 数位DP
- 数位dp
- 数位dp
- 数位DP
- 数位DP
- 数位dp
- 数位DP
- 数位DP
- 关于新手学习帝国之类的CMS工具建议
- 程序包报错 ORA-06508: PL/SQL: 无法找到正在调用的程序单元
- bae扩展服务日志等级区分
- 欢迎使用CSDN-markdown编辑器
- 2016.7.29 读取Xml文件的字段为null
- 数位dp
- MySQL存储过程权限
- Windows 系统快速打开计算器
- jQuery.Validate验证库
- java拼接byte[]
- Android Proguard混淆打包经验总结
- 如何发现优秀的开源项目
- 基于qualcomm平台的无人机开发demo
- 写 Gradle 插件的一点经验