首页 > 代码库 > hdu 3709 Balanced Number(数位dp)
hdu 3709 Balanced Number(数位dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709
题意:给定区间[a,b],求区间内平衡数的个数。所谓平衡数即有一位做平衡点,左右两边数字的力矩相等。
求力矩很显然可以想到dp[len][mid][cau],mid表示对称点,cau表示力矩大小。
然后很显然的记忆化索索
#include <iostream>#include <cstring>#include <cstdio>using namespace std;typedef long long ll;ll x , y , dp[20][20][2000];int dig[20];ll dfs(int len , int mid , int cau , int flag) { if(!len) return cau == 0; if(cau < 0) return 0; if(!flag && dp[len][mid][cau] != -1) return dp[len][mid][cau]; int t = flag ? dig[len] : 9; ll sum = 0; for(int i = 0 ; i <= t ; i++) { sum += dfs(len - 1 , mid , cau + i * (len - mid) , flag && i == t); } if(!flag) dp[len][mid][cau] = sum; return sum;}ll Gets(ll gg) { memset(dp , -1 , sizeof(dp)); int len = 0; if(gg < 0) return 0; if(gg == 0) return 1; while(gg) { dig[++len] = gg % 10; gg /= 10; } ll ans = 0; for(int i = len ; i >= 1 ; i--) { ans += dfs(len , i , 0 , 1); } return ans - (len - 1);}int main() { int t; scanf("%d" , &t); while(t--) { scanf("%lld%lld" , &x , &y); printf("%lld\n" , Gets(y) - Gets(x - 1)); } return 0;}
hdu 3709 Balanced Number(数位dp)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。