hdu 4722 good number 數位dp入門

明顯dp[i][j][k] 表示i爲取j的時候餘數爲k的個數 然後dp方程就顯然可得了,我看其他人都是2位,少了j這個位,但是我認爲有這位比較清楚啊,貼上代碼
#include<cstdio>
#include<cstring>
#define M 25
#define ll __int64
ll dp[M][10][10];
void init(){
    memset(dp,0,sizeof(dp));
    dp[0][0][0]=1;
    ll n=10;
    for(ll i=0;i<M-1;i++){
        for(ll j=0;j<n;j++){
            for(ll k=0;k<n;k++){
                for(ll k1=0;k1<n;k1++){
                    ll t1=(k+k1)%n;
                    dp[i+1][k1][t1]+=dp[i][j][k];
                }
            }
        }
    }
}
ll w[M];
ll f(ll n){
    if(n==0) return 0ll;
    ll len=0;
    while(n){
        w[++len]=n%10;
        n/=10;
    }
    ll flag=0;
    ll tsum=0;
    for(ll i=len;i>=1;i--){
        for(ll j=0;j<w[i];j++){
            ll t1=(100-flag)%10;
            tsum+=dp[i][j][t1];
        }
        flag+=w[i];
        flag%=10;
    }
    return tsum;
}
int main(){
    init();
    ll cas;
    while(~scanf("%I64d",&cas)){
        for(ll q=1;q<=cas;q++){
            ll a,b;scanf("%I64d%I64d",&a,&b);
            printf("Case #%I64d: ",q);
            printf("%I64d\n",f(b+1)-f(a));
        }
    }
    return 0;
}
/*
3
3213 65465456
*/

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