1. 程式人生 > 其它 >數位dp初學

數位dp初學

洛谷P4127 [AHOI2009]同類分佈

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 ll dp[20][163][163];//表示餘數和為md,考慮到dep位第dep位還未選,數位和為sum,餘數為mod滿足條件的方案數; 
 5 int a[20],md;
 6 ll L,R;
 7 ll dfs(int eq,int dep,int sum,int mod)
 8 {
 9     if(sum>md)return 0;
10     if(!dep)return
(sum==md)&&(!mod); 11 if(!eq&&~dp[dep][sum][mod])return dp[dep][sum][mod]; 12 int mx=eq?a[dep]:9; 13 ll ret=0; 14 for(int i=0;i<=mx;i++) 15 { 16 ret+=dfs(eq&&(mx==i),dep-1,sum+i,(mod*10+i)%md); 17 } 18 if(!eq) dp[dep][sum][mod]=ret; 19 return
ret; 20 } 21 ll work(ll n) 22 { 23 24 int cnt=0; 25 ll ret=0; 26 for(;n;n/=10)a[++cnt]=n%10; 27 for(int i=1;i<=cnt*9;i++) 28 { 29 md=i; 30 memset(dp,-1,sizeof(dp)); 31 ret+=dfs(1,cnt,0,0); 32 } 33 return ret; 34 } 35 int main() 36 { 37 scanf("
%lld%lld",&L,&R); 38 ll ret=work(R)-work(L-1); 39 printf("%lld",ret); 40 return 0; 41 }