HDU 2089 数位dp入门

Posted 天翎月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 2089 数位dp入门相关的知识,希望对你有一定的参考价值。

开始学习数位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));
}
}

  

以上是关于HDU 2089 数位dp入门的主要内容,如果未能解决你的问题,请参考以下文章

数位DP入门题 hdu 2089 hdu 3555

HDU 2089 不要62(数位dp入门)

HDU 2089 数位dp入门

HDU 2089 不要62数位DP入门题

HDU-2089不要62-暴力或数位DP入门

hdu 2089 不要62 数位dp入门