近来感觉状态压缩dp的强大性(灵活利用了二进制运算非常关键)。

于是做了俩提来看看。。毕竟队友是专业的dp。我仅仅是管中窥豹下而已。。

日后有机会再与之玩耍玩耍。。。ps:假设上天再给我一次机会,当年我愿意选择状态dp而不是网络流(仅仅针对眼下比赛出题潮流)

经典问题,不相邻/禁点方案数问题。poj3254

#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
int dp[5000][15];
int yu[5000];
int numstate=0;
int fib[15];
void init() //n行m列。状态一行推一行
{
scanf("%d%d",&n,&m);
int maxs=(1<<m);
for(int i=0;i<maxs;i++)
{
if(i&(i<<1)); //预处理掉每行相邻的状态(注意这里的右移用的好)
else yu[numstate++]=i;
}
int tx;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&tx);
if(tx==0) //fib【i】记录第i行禁止放的位子
fib[i]=fib[i]|(1<<(m-j-1));
}
}
}
void jhh()
{
for(int i=0;i<numstate;i++) //首行
{
if((yu[i]&fib[0]));
else dp[yu[i]][0]=1;
}
for(int i=1;i<n;i++)
{
for(int j=0;j<numstate;j++) //到当前行该(合法)状态的种树 =上行合法状态之和
{
if(fib[i]&yu[j])continue;
for(int k=0;k<numstate;k++)
{
if(yu[j]&yu[k]||yu[k]&fib[i-1])continue; //合法并且上下不冲突
dp[yu[j]][i]=(dp[yu[j]][i]+dp[yu[k]][i-1])%100000000;
}
}
}
int ans=0;
for(int i=0;i<numstate;i++)
{
ans=(ans+dp[yu[i]][n-1])%100000000;
}
printf("%d\n",ans);
}
int main()
{
init();
jhh();
}

hdu 5045, 求哪种排列最优。把复杂度从n!--》2^n*n。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m;
double dp[1040][12]; //dp【state】【I】做到第i题的状态的眼下最优情况。 int numstate=0;
double a[12][1005];
int main()
{
int T;
scanf("%d",&T);int cnt=1;
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%lf",&a[i][j]); double sums=0;
for(int ii=0;ii<m/n;ii++) //分成n段处理
{
for(int yy=0;yy<1029;yy++) //注意点double 型数组 除了0外不能用memset初始化
for(int xx=0;xx<12;xx++)
dp[yy][xx]=-1; dp[0][0]=0;
int maxst=1<<n;
for(int i=0;i<n;i++)
for(int j=0;j<maxst;j++)
{
if(dp[j][i]==-1)continue;
for(int k=1,kk=n;k<maxst;k=k<<1,kk--)
{
if((j&k)==0) //&优先级比比較运算符的低啊!!
dp[j|k][i+1]=max(dp[j|k][i+1],dp[j][i]+a[kk][i+1+n*ii]);
}
}
sums=sums+dp[maxst-1][n];
}
for(int yy=0;yy<1029;yy++)
for(int xx=0;xx<12;xx++)
dp[yy][xx]=-1;
dp[0][0]=0;
int maxst=1<<n;
for(int i=0;i<m%n;i++)
for(int j=0;j<maxst;j++)
{
if(dp[j][i]==-1)continue;
for(int k=1,kk=n;k<maxst;k=k<<1,kk--)
{
if((j&k)==0)
dp[j|k][i+1]=max(dp[j|k][i+1],dp[j][i]+a[kk][i+1+m/n*n]);
}
}
double maxss=-1;
for(int i=0;i<maxst;i++)
maxss=max(maxss,dp[i][m%n]);
sums=sums+maxss;
printf("Case #%d: %.5lf\n",cnt++,sums);
}
}

状态压缩dp poj 3254 hdu5045的更多相关文章

  1. poj 3254(状态压缩DP)

    poj  3254(状态压缩DP) 题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相 ...

  2. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  3. POJ 3254 (状态压缩DP)

    思路:状态压缩dp,用二进制位的1表示放了,0表示没有放.设dp[i][j],表示第i行状态为j时,前i行的方案数,状态转移方程就是 dp[i][j] += dp[i-1][k],j与k这两个状态不冲 ...

  4. POJ 3254 Corn Fields (状态压缩DP)

    题意:在由方格组成的矩形里面种草,相邻方格不能都种草,有障碍的地方不能种草,问有多少种种草方案(不种也算一种方案). 分析:方格边长范围只有12,用状态压缩dp好解决. 预处理:每一行的障碍用一个状态 ...

  5. POJ 3254 【状态压缩DP】

    题意: 给一块n*m的田地,1代表肥沃,0代表贫瘠. 现在要求在肥沃的土地上种草,要求任何两个草都不能相邻. 问一共有多少种种草的方法. 种0棵草也是其中的一种方法. n和m都不大于12. 思路: 状 ...

  6. POJ Corn Fields 状态压缩DP基础题

    题目链接:http://poj.org/problem?id=3254 题目大意(名称什么的可能不一样,不过表达的意思还是一样的): 种玉米 王小二从小学一年级到现在每次考试都是班级倒数第一名,他的爸 ...

  7. POJ 3691 (AC自动机+状态压缩DP)

    题目链接:  http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...

  8. poj 3311(状态压缩DP)

    poj  3311(状态压缩DP) 题意:一个人送披萨从原点出发,每次不超过10个地方,每个地方可以重复走,给出这些地方之间的时间,求送完披萨回到原点的最小时间. 解析:类似TSP问题,但是每个点可以 ...

  9. poj 1185(状态压缩DP)

    poj  1185(状态压缩DP) 题意:在一个N*M的矩阵中,‘H'表示不能放大炮,’P'表示可以放大炮,大炮能攻击到沿横向左右各两格,沿纵向上下各两格,现在要放尽可能多的大炮使得,大炮之间不能相互 ...

随机推荐

  1. POJ 1946 DP

    折腾了一晚上 明天再写.. 2016.5.17 23:59 -> -> #include <cstdio> #include <cstring> #include ...

  2. 树莓派-解决apt-get upgrade速度慢的方法[更换阿里云源]

    执行 apt-get upgrade 遇到速度慢的原因: 使用国外软件源 解决方法也很简单,将源换为国内环境即可,我选择阿里云 步骤 1.备份为 sources.list sudo cp /etc/a ...

  3. 文件的上传(可以上传照片,word文档,等单个文件)

    jsp: jsp页面: <LINK href="${basePath}plugins/uploadify/uploadify.css" type="text/css ...

  4. 【java基础】(3)Java继承内存分配

    继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法. (3)子类中定义的成员变量和父类中定义 ...

  5. 酷派 5267 刷入第三方 recovery教程 刷机 ROOT

    准备工作: 一台电脑: 酷派5267手机: 一张内存卡: 下载好刷机资料:  http://pan.baidu.com/s/1i4LoVh7 备用下载: http://pan.baidu.com/s/ ...

  6. 4 Things I Wish I Would Have Known When I Started My Software Development Career【当我最开始从事软件工程师的时候我希望我知道的四件事】

    英文原文:http://simpleprogrammer.com/2013/08/19/software-development-career/ My software development car ...

  7. 【Oracle】数据迁移工具(2):Data Dump

    Data Dump 使用命令行IMPDP/EXPDP实现导入导出表.schema.表空间及数据库.IMPDP/EXPDP命令行中可以加入以下选项,来实现更细粒度的导入导出. IMPDP/EXPDP和I ...

  8. Swift Method Dispatching — a summary of my talk at Swift Warsaw

    Swift Method Dispatching When announcing Swift, Apple described it as being much faster than Objecti ...

  9. SQL基本概述

    DBMS的种类: 层次数据库HDB 面向对象数据库OODB XML数据库XMLDB 键值存储系统KVS 关系数据库RDB RDBMS(关系数据库管理系统),主要5有种: Oracle Database ...

  10. 团体程序设计天梯赛-练习集-L1-047. 装睡

    L1-047. 装睡 你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-70次.下面给 ...