http://acm.hdu.edu.cn/showproblem.php?pid=3709
题意:在一个区间内有多少个,可以一这个数中的一个数字为支点,两边的数字乘上边距的和相等。
数位dp,枚举支点。
1 #include2 #include 3 #include 4 #define ll __int64 5 using namespace std; 6 7 ll dp[21][21][2000]; 8 int num[30]; 9 10 ll dfs(int pos,int cen,int sum,bool flag)11 {12 if(pos==-1)13 {14 if(sum==0) return 1;15 else return 0;16 }17 if(sum<0) return 0;18 if(!flag&&dp[pos][cen][sum]!=-1) return dp[pos][cen][sum];19 ll ans=0;20 int xx=flag?num[pos]:9;21 for(int i=0; i<=xx; i++)22 {23 ans+=dfs(pos-1,cen,sum+i*(pos-cen),flag&&(i==xx));24 }25 if(!flag) dp[pos][cen][sum]=ans;26 return ans;27 }28 29 ll get(ll n)30 {31 int cnt=0;32 while(n)33 {34 num[cnt++]=n%10;35 n=n/10;36 }37 ll ans=0;38 for(int i=0; i