首页 > 代码库 > hdu 4734 F(x)(数位dp)
hdu 4734 F(x)(数位dp)
题目链接:hdu 4734 F(x)
题目大意:给定f(x)的计算公式,现在给出n和m,求有多少个x,x <= m,并且f(x) <= f(n)
解题思路:数位dp,dp[i][j]表示到第10i内,然后f值为j的总数。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 10000;
int n, bit[15];
int dp[15][maxn];
int init () {
int s = n = 0, a, b;
scanf("%d%d", &a, &b);
for (int i = 0; a; i++) {
s += (a % 10) * (1<<i);
a /= 10;
}
while (b) {
bit[n++] = b % 10;
b /= 10;
}
return s;
}
int dfs (int d, int s, int flag) {
if (d == -1)
return (s >= 0);
if (flag == 0 && dp[d][s] != -1)
return dp[d][s];
int ret = 0, end = (flag ? bit[d] : 9);
for (int i = 0; i <= end; i++) {
if (s < i * (1<<d))
continue;
ret += dfs(d - 1, s - i * (1<<d), flag && i == end);
}
if (flag == 0)
dp[d][s] = ret;
return ret;
}
int main () {
int cas;
scanf("%d", &cas);
memset(dp, -1, sizeof(dp));
for (int kcas = 1; kcas <= cas; kcas++) {
int f = init();
printf("Case #%d: %d\n", kcas, dfs(n - 1, f, 1));
}
return 0;
}
hdu 4734 F(x)(数位dp)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。