Balanced Number
题解:dp[ i ][ j ][ k ]表示第i个位置,支点是j,支点左右两边的重量之差是k。当k==0时,说明这个数是Balanced Number。充分利用了回溯这个过程!
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 typedef long long ll; 7 8 ll a,b,n; 9 ll num[20],dp[20][20][4000]; 10 11 ll DFS(int pos,int res,int sum,bool F){ 12 if(sum<0) return 0; 13 if(pos==-1) return sum==0; 14 if(!F&&dp[pos][res][sum]!=-1) return dp[pos][res][sum]; 15 16 int maxv=F?num[pos]:9; 17 ll ans=0; 18 for(int i=0;i<=maxv;i++) ans=ans+DFS(pos-1,res,sum+i*(pos-res),F&&i==maxv); 19 20 if(!F) dp[pos][res][sum]=ans; 21 return ans; 22 } 23 24 ll Solve(ll temp){ 25 if(temp==0) return 1; 26 int cnt=0; 27 while(temp){ 28 num[cnt++]=temp%10; 29 temp/=10; 30 } 31 ll ans=0; 32 for(int i=cnt-1;i>=0;i--) ans=ans+DFS(cnt-1,i,0,true); //枚举支点,非常机智,放在深搜的外面 33 return ans-cnt+1; //因为0,00,。。。,000000,。。。都是符合的,所以要减去重复的。 34 } 35 36 int main() 37 { memset(dp,-1,sizeof(dp)); 38 cin>>n; 39 while(n--){ cin>>a>>b; cout<<Solve(b)-Solve(a-1)<<endl; } 40 return 0; 41 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步