近来感觉状态压缩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. SQL之LEFT JOIN,EIGHT JOIN,INSERT JOIN的区别

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...

  2. Python生成器(yield)

    对于调用一个普通的Python函数,一般是从函数的第一行代码开始执行,结束于return语句.异常或者函数所有语句执行完毕.一旦函数将控制权交还给调用者,就意味着全部结束.函数中做的所有工作以及保存在 ...

  3. Dijkstra TYVJ 1031热浪 Dijkstra测试数据

    测试用邻接表写得Dijkstra 代码写得很烂. 描述 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer Jo ...

  4. 前端性能优化---DOM操作

    小结 1缓存DOM对象 场景:缓存DOM对象的方式也经常被用在元素的查找中,查找元素应该是DOM操作中最频繁的操作了,其效率优化也是大头.在一般情况下,我们会根据需要,将一些频繁被查找的元素缓存起来, ...

  5. [PHP][学习笔记][CURL]监测设备运行情况小demo

    1.curl获取的web content 不能直接echo到页面,会造成js各种错误 2.想办法处理字符串的截取.拼接 2.1.裁剪html返回的字符串 function cutStringFrom( ...

  6. 【Linux】连接CRT

    linux中出现crt连接不上多数是ip地址设置不正确. window中命令行界面(cmd进入),输入ipconfig,查看虚拟机的ip. 打开linux终端,命令行下输入:ifconfig eth0 ...

  7. 三维重建面试13X:一些算法试题-今日头条AI-Lab

             被人牵着鼻子走,到了地方还墨明棋妙地吃一顿砖头.今日头条AI-Lab,其实我一直发现,最擅长的还是点云图像处理,且只是点云处理. 一.C++题目   New 与Malloc的区别: ...

  8. 关于java中的继承

    我们都知道Java中的继承是复用代码.扩展子类的一种方式,继承使得Java中重复的代码能够被提取出来供子类共用,对于Java程序的性能以及修改和扩展有很大的意义,所以这是一个非常重要的知识点. 那么对 ...

  9. python tips:类的绑定方法(bound)和非绑定方法(unbound)

    类属性只有类及其实例能够访问,可以理解为一个独立的命名空间. Python中类属性的引用方式有两种: 1. 通过类的实例进行属性引用,称为绑定方法(bound method),可以理解为方法与实例绑定 ...

  10. snv报错

    ERROR svn: E160028: Commit failed svn出现上面错误,先更新再提交即可解决.