LightOJ - 1032 Fast Bit Calculations(数位DP)
2015-10-27 23:22
465 查看
题目大意:求0-n的二进制数的所有相邻1的数量
相邻1指两个1相邻
解题思路:数位dp,dp[i][j][k]表示第i个位置,前一个数是j,到目前为止相邻的1有k个的相邻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; }
相关文章推荐
- http://blog.csdn.net/jungsagacity/article/details/7618587
- 二叉排序树第一版
- hdu 2066 一个人的旅行
- Unable to start activity com.unionpay.uppay.PayActivity
- Oracle改变编码为UTF8
- Java GUI API
- Java:泛型
- python笔记002——条件和循环
- fs4412开发板学习笔记(四)
- Web API应用架构在Winform混合框架中的应用(5)--系统级别字典和公司级别字典并存的处理方式
- dhcp服务器安装过程
- HTTP Chunk分块&java.io.IOException: CRLF&missing CR
- Spring2:bean的使用
- 删除快捷方式右下图标后,并能添加到快速启动栏
- Python中调用设置环境变量的bat
- 用自定义继承Animation写一个跑圈运动
- JAVA设计模式之单例模式
- PHP运行出现Notice : Use of undefined constant 的完美解决方案
- LightOJ - 1031 Easy Game(区间DP)
- 常用关系运算符