ps:最近碰到一些用bitset优化常数的题目,以前也有接触但是都没有记下来,所以来写一篇博文 记录以后碰到的类似的题目。


应用一: 优化boolean multiplication

在做dp的时候,有时候会需要将两个dp矩阵相乘,且矩阵的元素都是bool型。

计算矩阵A*B=C     C[i,j]=1 当且仅当存在k,A[i,k]=1 && B[k][j]=1 。

直接算需要O(n3)的时间。可以用bitset 优化常数。 做法如下:

 bitset<N> A[N],B[N],C[N];

 void Multi(bitset<N> A[],bitset<N> B[],bitset<N> C[])
{
for (int i=;i<N;i++)
{
for (int j=;j<N;j++)
{
if (A[i][j]) C[i]|=B[j];
}
}
}

大致思想是:

如果A[i][j]=1,  C[i][k] |= A[i][j] & B[j][k]    <->  C[i][k] |= B[j][k]     相当于把B的第j行拿去 和C的第i行做一次或操作。

题目:

http://codeforces.com/contest/781/problem/D

该题的dp矩阵是boolean矩阵,转移的时候可以用bitset来优化boolean multiplication。

 #include <iostream>
#include <string>
#include <cstring>
#include <map>
#include <cmath>
#include <set>
#include <bitset>
using namespace std; typedef long long ll; #define N 510 bitset<N> dp[][][N]; int main()
{
//freopen("in.in","r",stdin);
//freopen("out.out","w",stdout); int n,m,x,y,z;
scanf("%d%d",&n,&m);
while (m--)
{
scanf("%d%d%d",&x,&y,&z);
x--,y--,dp[][z][x][y]=;
} for (int l=;l<=;l++)
{
for (int i=;i<n;i++)
{
for (int j=;j<n;j++)
{
if (dp[l-][][i][j]) dp[l][][i]|=dp[l-][][j];
if (dp[l-][][i][j]) dp[l][][i]|=dp[l-][][j];
}
}
}
ll ans=; set<int> S; S.insert();
for (int l=,w=;l>= && ans<=1e18;l--)
{
set<int> SS;
for (set<int>::iterator iter=S.begin();iter!=S.end();iter++)
{
int x=*iter;
for (int j=;j<n;j++) if (dp[l][w][x][j]) SS.insert(j);
}
if (!SS.empty()) ans+=1ll<<l,S=SS,w^=;
}
if (ans>1e18) ans=-;
printf("%I64d\n",ans);
return ;
}

待补充...

最新文章

  1. iOS总结:项目中的各种小坑汇总
  2. 理解逐次逼近寄存器型ADC:与其它类型ADC的架构对比【转】
  3. LCA-倍增法(在线)
  4. dubbo与zookeeper安装手册
  5. snapshot
  6. OpenJudge_cdqz 数据结构版块小结
  7. 文件磁盘读写类CArchive类
  8. 用php做省份的三级联动 附带数据库
  9. 原来你是这样的Websocket--抓包分析
  10. .net core 注入中的三种模式:Singleton、Scoped 和 Transient
  11. Kubernetes 1.3.1 快速单机部署
  12. Django--CRM--QueryDict, 模糊搜索, 加行级锁
  13. hdu4289 Control 最大流最小割
  14. React Native(三)——推送jpush-react-native
  15. windows下安装并使用redis
  16. jQuery-理解事件
  17. git删除未监视的文件
  18. 为什么要放弃ssh框架
  19. NoSQL文章
  20. UVaOJ 694 - The Collatz Sequence

热门文章

  1. RMAN恢复 增加表空间后控制文件丢失
  2. 各种Lisp系语言大检阅
  3. linux如何安装xampp,以及融合dvwa
  4. python pip更换下载源(转)
  5. opengl中VAO,VBO,IBO用法小结(zz) 【转】
  6. webpack配置:css文件打包、JS压缩打包和HTML文件发布
  7. [Python爬虫] 之二十五:Selenium +phantomjs 利用 pyquery抓取今日头条网数据
  8. 【原】使用StarUML画用例图
  9. 【POJ 1080】 Human Gene Functions
  10. 改动图片exif信息