lightoj 1032 - Fast Bit Calculations (数位DP)
2015-08-18 20:46
429 查看
记忆花搜索:dp[len][num][last] : 现在处理第len位,前面有num个11,并且最后一位为last。
/*********************************************** * Author: fisty * Created Time: 2015-08-18 20:18:09 * File Name : 1032.cpp *********************************************** */ #include <iostream> #include <cstring> #include <deque> #include <cmath> #include <queue> #include <stack> #include <list> #include <map> #include <set> #include <string> #include <vector> #include <cstdio> #include <bitset> #include <algorithm> using namespace std; #define Debug(x) cout << #x << " " << x <<endl #define Memset(x, a) memset(x, a, sizeof(x)) const int INF = 0x3f3f3f3f; typedef long long LL; typedef pair<int, int> P; #define FOR(i, a, b) for(int i = a;i < b; i++) #define lson l, m, k<<1 #define rson m+1, r, k<<1|1 #define MAX_N 32 int t; int digit[MAX_N]; LL dp[MAX_N][MAX_N][2]; LL dfs(int len, int num, int e, int last){ //当前在第len位, 前面有num个11,边界信息为e,最后一位为last if(len < 0) return num; if(!e && dp[len][num][last] != -1) return dp[len][num][last]; LL ans = 0; int end = (e ? digit[len] : 1); for(int i = 0; i <= end; i++){ if(i && last){ //上一位和此位都为1 ans += dfs(len-1, num+1, e&&i==end, i); }else{ ans += dfs(len-1, num, e&&i==end, i); } } if(!e) dp[len][num][last] = ans; return ans; } LL solve(int n){ int len = 0; Memset(dp, -1); while(n){ digit[len++] = n % 2; n /= 2; } return dfs(len-1, 0, 1, 0); } int main() { //freopen("in.cpp", "r", stdin); //cin.tie(0); //ios::sync_with_stdio(false); scanf("%d", &t); int cnt = 1; while(t--){ int n; scanf("%d", &n); printf("Case %d: %lld\n", cnt++, solve(n)); } return 0; }
相关文章推荐
- Linux查看CPU和内存使用情况
- 2015Robocup --机器人世界杯(合肥)
- 过河问题
- Android LinearLayout布局
- LDA(文档主题生成模型)--零基础(一)
- poj 2117 Electricity 【无向图求割点】【求去掉一个点后 图中最多的BCC数目】
- Java中我常使用的ArrayList方法
- Java深度历险(五)Java泛型
- 数据结构之---C语言实现最短路径之Dijkstra(迪杰斯特拉)算法
- Frameset使用教程
- Autofac 的属性注入方式
- winform通过https与服务器进行通信
- 安装vcenter是出现的错误
- hdoj 1598 【并查集加贪心】
- hdu 2059 龟兔赛跑
- POJ 1094 Sorting It All Out【拓扑 邻接表 邻接矩阵 唯一确定顺序】
- (转)四种方案解决ScrollView嵌套ListView问题
- python *和**
- hdu-5402(多校2015)
- 指针和引用区别(More Effective_C++_1(基础))