【codevs 2451】互不侵犯king 状压dp
2015-10-22 08:55
260 查看
学长说这是模板题……
貌似确实是……
算了QAQ
因为数组的原因让DQS帮我调了半天……QAQ果然dp不爽系列
貌似确实是……
算了QAQ
因为数组的原因让DQS帮我调了半天……QAQ果然dp不爽系列
[code]#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int MAXN = 1 << 11; long long dp[12][MAXN][100]; int n,king; int get_k(int x) { int ans = 0; for(int i = n;i >= 1;i --) if(x & (1 << i)) ans ++; return ans; } void print(int x) { for(int i = n;i >= 1;i --) cout<<( (x >> i) & 1); cout<<" "; } bool cannot(int x) { return (x & (x << 1)) && (x & (x >> 1)); } void dpdpd() { for(int i = 0;i < (1 << (n + 1));i ++) dp[1][i][get_k(i)] = 1; for(int i = 2;i <= n;i ++) { for(int l = 0;l < (1 << (n + 1));l ++) { if(cannot(l)) continue; for(int j = 0;j < (1 << (n + 1));j ++) { int us = get_k(j); if(cannot(j)) continue; if(!(l & 1) && !(j & 1) && !(j & l) && !(j & (l << 1)) && !(j & (l >> 1))) { for(int k = 0;k <= king - us;k ++) { dp[i][j][k + us] += dp[i - 1][l][k]; // print(l);print(j);printf("%d %d %d %d\n",i,dp[i-1][l][k],dp[i][j][k+us],k+us);puts(""); } } } } } return; } int main() { scanf("%d %d",&n,&king); dpdpd(); long long ans = 0; for(int i = 0;i < (1 << (n + 1));i ++) ans += dp [i][king]; printf("%lld\n",ans); return 0; }
相关文章推荐
- swing 组合框(下拉框)获取选中的值
- ssh登录会话保持时间太短解决方法之一
- String当中的高效函数(优化)
- 简单的分析洋葱淘app这款产品
- swing 组合框(下拉框)填充默认值
- 第17章 内存映射文件(1)_内存映射文件简介
- js 传递方法
- 冒泡排序法
- 【luogu P1440】求(DQ)M区间内的最小值
- 解决VS2010链接错误:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- extjs 4.2后台传递的时间字符串2015-01-02会自动变为时间
- 黑马程序员----总结2(创建线程、同步、线程间通讯)
- spring软件地址
- 二叉树之实现排序二叉树
- position
- swing 单选框(互斥buttonGroup),设置默认值,获取值
- 黑马程序员-OC回顾-基础语法(二)
- c总结8 --- 二级指针使用三种模型之一(二级指针1)
- 关于java POI读取Excel2007流关不掉问题
- webview简单使用