hdu 2089 数位dp
来源:互联网 发布:inode mac版 编辑:程序博客网 时间:2024/04/20 05:54
题意:给定一个区间[n,m],问在其中的不包含数字4,且不包含连续的62的数字有多少个?
思路:典型的数位dp。dp[i,j]表示开头为j的i位数中满足要求的数量。求和的时候先解析出数字,然后从高位往低位求和。
#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#define clr(s,t) memset(s,t,sizeof(s));using namespace std;#define N 20005int dp[9][12],digit[9];int n,m;void init(){ clr(dp, 0); dp[0][0] = 1; for(int i = 1;i<=7;i++) for(int j = 0;j<=9;j++) for(int k = 0;k<=9;k++) if(!(j==4 || ((j==6)&&(k==2)))) dp[i][j] += dp[i-1][k];}int solve(int x){//[0,x-1]符合条件的个数 int len = 0; int res = 0; while(x){ digit[++len] = x%10; x /= 10; } digit[len+1] = -1; for(int i = len;i>=1;i--){ for(int j = 0;j<digit[i];j++) if(!(j==4 || ((j==2)&&(digit[i+1]==6)))) res += dp[i][j]; if(digit[i] == 4 || ((digit[i]==2)&&(digit[i+1]==6)))//一个剪枝,当前位已经不满足了,不必往后求和啦 break; } return res;}int main(){ init(); while(scanf("%d %d",&n,&m) && (n+m)) printf("%d\n",solve(m+1)-solve(n));}
0 0
- HDU 2089 数位DP
- Hdu 2089 数位dp
- HDU 2089 数位DP
- 数位DP hdu-2089
- HDU 2089 数位DP
- HDU 2089【数位DP】
- 【数位DP】 HDU 2089
- 数位DP hdu 2089
- hdu 2089 数位DP
- hdu 2089 数位dp
- hdu 2089 数位dp
- hdu 2089 数位dp
- HDU 2089 数位DP
- HDU 2089 数位DP
- hdu 2089 数位DP
- HDU-2089-数位dp
- HDU 2089 数位DP
- hdu 2089 数位dp
- iOS开发 ☞ IPv6
- app启动过程
- MySql的基本配置和使用
- 使用GDB来调试程序
- 用tcc遇到的一个大坑
- hdu 2089 数位dp
- ThinkPHP中的调试模式
- Windows平台基于Caffe框架的LeNet网络训练
- JDK1.6生成webservice及访问
- UNIX网络编程笔记(1)—传输层协议
- 1个iframe提交表单到另一个iframe,在另一个iframe中显示
- JSP注释 <%-- --%> 和 <!-- --> 的区别
- 用ant编译时出现“编码 UTF8 的不可映射字符“
- CAS 实现单点登陆之一 : CAS Server 部署