近来感觉状态压缩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. hdu 3037Saving Beans(卢卡斯定理)

    Saving Beans Saving Beans Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  2. Oracle 批量插入值

    工作中常遇到将Excel文档数据转为SQL语句,然后再将SQL语句插入到数据库已完成数据转移保存到数据库中,下面介绍下如何一次性插入多条SQL语句,先抛个图: 由于真实数据不变给大家看,所以这里是做了 ...

  3. Java中数组要点总结

    1.数组是基本数据类型和字符串类型的容器(引用数据类型),而集合是类数据类型的容器: 2.数组定义的格式: (1)一般格式: 元素类型[] 数组名 = new 元素类型[元素个数或者数组长度]: 其中 ...

  4. 使用TortoiseSVN碰到的几个问题(1)-导入,提交,更新

    1)导入数据到版本库 第一种情况,使用Import导入命令的时候 不能选择包含哪些指定文件或目录, 导入的文件夹不能变成工作副本,(如果你在“工作副本”目录下执行导入命令是不起作用的.)必须通过签出操 ...

  5. 深入浅出java多态

    所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个 ...

  6. c++ 中一个类或者一个对象所占的字节数

    转载博客:转载地址https://www.cnblogs.com/JingHuanXiao/p/6080726.html 一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数 ...

  7. linux挂载ntfs格式的U盘

    1.需要安装一个ntfs-3G工具 工具包下载网站:http://www.tuxera.com/community/ntfs-3g-download/ 根据情况选择要下载的包. 2.上传到Linux服 ...

  8. Sobel算子取代:基于特定点方向的canny边缘检测

    前言: Canny边缘检测使用了Sobel算子,计算dx和dy两个方向,对于特定方向的边缘检测,可以作少量修改. 代码: 计算特定方向上的边缘 void CannyOrient( cv::Mat &a ...

  9. 安卓代码迁移:ActionBarActivity: cannot be resolved to a type

    参考链接:http://stackoverflow.com/questions/18830736/actionbaractivity-cannot-be-resolved-to-a-type in e ...

  10. 【sqli-labs】 less13 POST - Double Injection - Single quotes- String -twist (POST型单引号变形双注入)

    报错 闭合掉括号 这关登录成功之后不显示登录的用户名密码了