題目連接:http://acm.hdu.edu.cn/showproblem.php?pid=5179
題意:給你一個範圍,問你漂亮的數有多少個,漂亮的數的定義爲 數位高的比數位低的大,並且 數位高的數%數位低的數爲0
題解:數位DP,詳細看代碼,爲了方便,我把所有的參數全部設爲了狀態,這樣就不用判斷了
#include<cstdio>
#include<cstring>
#define F(i,a,b) for(int i=a;i<=b;i++)
int t,n,m,dig[11],len,dp[11][2][11][2];
int dfs(int pos,bool inf=1,int pre=0,int zo=1){
if(!pos)return 1;
if(dp[pos][inf][pre][zo]!=-1)return dp[pos][inf][pre][zo];
int end=inf?dig[pos]:9,ans=0;
F(i,0,end)if(zo||(pre>=i&&i!=0&&pre%i==0))
ans+=dfs(pos-1,i==end&&inf,i,i==0&&zo);
return dp[pos][inf][pre][zo]=ans;;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m),n--;
memset(dp,-1,sizeof(dp));
for(len=0;n;n/=10)dig[++len]=n%10;
int tmp=dfs(len);
memset(dp,-1,sizeof(dp));
for(len=0;m;m/=10)dig[++len]=m%10;
int ss=dfs(len);
printf("%d\n",ss-tmp);
}
return 0;
}