标签:算法 定义 desc des scanf 开始 time numbers rom
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 9036 Accepted Submission(s): 4294
#include<iostream> #include<string.h> #define ll long long using namespace std; ll shu[20], dp[20][20][2000];//dp[i][j][k],i是长度,j是支点,k是力矩和,dp[i][j][k]是以j为支点的平衡数的数量 ll dfs(ll len, ll zhidian, ll sum, bool shangxian) { if (len == 0) return sum == 0 ? 1 : 0; if (sum < 0)//因为力矩和是从支点右边开始算的(sum>0),如果左边的力矩都处理完之后sum<0,那一定不是平衡数 return 0; if (!shangxian&&dp[len][zhidian][sum]!=-1) return dp[len][zhidian][sum]; ll mx, cnt = 0; mx = (shangxian ? shu[len] : 9); for (ll i = 0; i <= mx; i++)//注意是<= { ll temp = sum; temp = temp + (len - zhidian)*i;//len会不断的被return ,细细体会 cnt = cnt + dfs(len - 1, zhidian, temp, i == mx && shangxian); } if (!shangxian) dp[len][zhidian][sum] = cnt; return cnt; } ll solve(ll n) { ll len = 0; while (n) { shu[++len] = n % 10; n = n / 10; } ll ans = 0; for (ll i = 1; i <= len; i++)//支点是从1开始,因为最高位的数一定不是平衡数 ans = ans + dfs(len, i, 0, true); return ans - (len - 1);//如果0是支点,程序也会判断是平衡数,但是不符合题意 } int main() { ll l, r, t; scanf("%lld", &t); memset(dp,-1,sizeof(dp));//如果默认0会TLE while (t--) { scanf("%lld%lld", &l, &r); printf("%lld\n", solve(r) - solve(l - 1)); } return 0; }
hdu 3709 Balanced Number(平衡数)--数位dp
标签:算法 定义 desc des scanf 开始 time numbers rom
原文地址:https://www.cnblogs.com/-citywall123/p/10752666.html