HDU 2089 简单数位dp

时间:2021-12-09 16:26:39

1、HDU 2089  不要62    简单数位dp

2、总结:看了题解才敲出来的,还是好弱。。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; int dp[][]; //dp[i][j]表示以j为首位符合条件的i位数的个数 void init() //预处理
{
memset(dp,,sizeof(dp));
dp[][]=;
for(int i=;i<;i++){
for(int j=;j<;j++){ //枚举第i位
for(int l=;l<;l++){ //枚举第i-1位
if(j!=&&(!(j==&&l==))){
dp[i][j]+=dp[i-][l];
}
}
}
}
} int cal(int num)
{
int a[],k=,sum=;
while(num){
a[++k]=num%;
num/=;
} a[k+]=;
for(int i=k;i>;i--){
for(int j=;j<a[i];j++){
if(j!=&&!(a[i+]==&&j==)){
sum+=dp[i][j];
}
}
if(a[i]==||(a[i+]==&&a[i]==)){ //因为是从首位开始,如果前面已经不符合,后面就没必要进行了
break;
}
} return sum;
} int main()
{
init();
int n,m;
while(scanf("%d%d",&n,&m)!=EOF,n&&m)
{
printf("%d\n",cal(m+)-cal(n)); //cal函数没有考虑到num本身
} return ;
}