数位DP入门
真的是好久不写了
入门题搞了一个小时
依旧延续DP的优良传统
想不到的状态
推不出的转移
但是好像这道题是数位DP的常规想法
手好冷啊不想打字了……
参考链接
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
int t[10],f[10][10];
void pre()
{
int i,j,k;
f[0][0]=1;
for(i=1;i<=7;i++)
for(j=0;j<=9;j++)
{
if(j==4) f[i][j]=0;
else
{
for(k=0;k<=9;k++)
f[i][j]+=f[i-1][k];
if(j==6) f[i][j]-=f[i-1][2];
}
}
}
int work(int x)
{
int re=0,cnt=0,i,j;
while(x)
{
cnt++;
t[cnt]=x%10;
x/=10;
}
t[cnt+1]=0;
for(i=cnt;i>=1;i--)
{
for(j=0;j<t[i];j++)
if(j!=4&&!(t[i+1]==6&&j==2)) re+=f[i][j];
if(t[i]==4) break;
if(t[i+1]==6&&t[i]==2) break;
}
return re;
}
int main()
{
int n,m,p1,p2;
pre();
scanf("%d%d",&n,&m);
while(n!=0&&m!=0)
{
p1=work(n);
p2=work(m+1);
printf("%d\n",p2-p1);
scanf("%d%d",&n,&m);
}
return 0;
}