HDU 2089 数位dp入门

时间:2022-11-18 20:43:34

开始学习数位dp...一道昨天看过代码思想的题今天打了近两个小时..最后还是看了别人的代码找bug...(丢丢)

传说院赛要取消 ? ... 这么菜不出去丢人也好吧~

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<queue>
using namespace std;
int n,m;
/// 数位dp 含62与4不吉利
/// dp数组用来存 第i位 以j开头 的吉利数
int dp[11][11];
void init(){
memset(dp,0,sizeof(dp));
for(int i=0;i<=9;i++)
    dp[1][i]=1;
dp[1][4]=0;
for(int i=2;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 cal(int x){
if(x==0)
    return 1;
int A[11];
int z=0;
while(x>0)
{
    z++;
    A[z]=x%10;
    x/=10;
}
int ans=0;
A[z+1]=0;
for(int i=z;i>=1;i--)
{
    for(int j=0;j<A[i];j++)
    {
        if(j!=4&&!(A[i+1]==6&&j==2))
            ans+=dp[i][j];
    }
    if((A[i+1]==6&&A[i]==2)||A[i]==4)
        break;
}
return ans;
}
int main(){
init();
while(~scanf("%d%d",&n,&m))
{
    if(n==0&&m==0)
        break;
    printf("%d\n",cal(m+1)-cal(n));
}
}