您的位置:首页 > 其它

LightOJ - 1032 Fast Bit Calculations(数位DP)

2015-10-27 23:22 381 查看
题目大意:求0-n的二进制数的所有相邻1的数量

相邻1指两个1相邻

解题思路:数位dp,dp[i][j][k]表示第i个位置,前一个数是j,到目前为止相邻的1有k个的相邻1的总数

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 65;

int digit
;
LL dp
[3]
;

int cas = 1;
LL dfs(int pos, int pre, LL num, int limit, int first) {
if (pos == 0) return num;

if (!limit && !first && ~dp[pos][pre][num]) return dp[pos][pre][num];
int n = limit ? digit[pos] : 1;
LL ans = 0;
for (int i = 0; i <= n; i++) {
if (first) ans += dfs(pos - 1, i, 0, limit && i == n, first && i == 0);
else {
if (i == 1 && pre == 1) ans += dfs(pos - 1, i, num + 1, limit && i == n, first && i == 0);
else ans += dfs(pos - 1, i, num, limit && i == n, first && i == 0);
}
}
if (!limit && !first) dp[pos][pre][num] = ans;
return ans;
}

void solve() {
int num, cnt = 0;
memset(dp, -1, sizeof(dp));
scanf("%d", &num);
while (num) {
digit[++cnt] = num % 2;
num /= 2;
}
printf("Case %d: %lld\n", cas++, dfs(cnt, 0, 0, 1, 1));
}

int main() {
int test;
scanf("%d", &test);
while (test--) solve();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: