hdu_5179_beautiful number(數位DP)

題目連接: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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章