标签:
2.支点的转化:原本想直接在dfs里面看看能否设置为一个pivot动一个不动,但是没搞出来,之后就直接枚举了...每次数位DP多要看看前置0的影响。这道题每一个支点都会有一个0,所以减去重复的即可。
#include<bits/stdc++.h> using namespace std; #define MS1(a) memset(a,-1,sizeof(a)) #define MS0(a) memset(a,0,sizeof(a)) typedef long long ll; int bit[23]; ll dp[20][1800][20]; ll dfs(int pos,int val,int pivot,bool edge) { if(val < 0) return 0; if(pos == -1) return val == 0; if(!edge && dp[pos][val][pivot] >= 0) return dp[pos][val][pivot]; int end = edge ? bit[pos] : 9; ll ans = 0; for(int i = 0;i <= end;i++){ ans += dfs(pos - 1,val+i*(pos - pivot),pivot,edge&&(i==end)); } if(!edge) dp[pos][val][pivot] = ans; return ans; } ll calc(ll n) { if(n == -1) return 0; int tot = 0; while(n){ bit[tot++] = n%10; n /= 10; } ll ans = 0; for(int i = tot - 1;i >= 0;i--) ans += dfs(tot - 1,0,i,true); return ans - tot + 1; } int main() { MS1(dp); int T; scanf("%d",&T); while(T--){ ll L,R; scanf("%I64d%I64d",&L,&R); printf("%I64d\n",calc(R) - calc(L-1)); } }
标签:
原文地址:http://www.cnblogs.com/hxer/p/5177455.html