这一章真是心态崩,剪枝太玄学啦,特别是那个搜索顺序我靠真的。。。

poj1011 枚举答案,搜索记录当前到第几根木棒。 剪枝:1、从大到小排序 2、排除等效,这个感觉还行,就是木棒按大小顺序进去,去除顺序不同的相同的情况,相同的木棒也是不用管的。  好的前面这些都可以想,关键是第三个,拼接第一个失败就全部重来。这个真是没想到

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int n,L,C,c[];
bool cmp(int x,int y){return x>y;}
bool v[];
bool dfs(int k,int len,int last)
{
if(k==C+)return true;
if(len==L)return dfs(k+,,); int fail=;
for(int i=last+;i<=n;i++)
{
if(v[i]==false&&len+c[i]<=L&&c[i]!=fail)
{
v[i]=true;
if(dfs(k,len+c[i],i))return true;
v[i]=false;
fail=c[i];
if(len==)return false;
}
}
return false;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==)break; int sum=;
for(int i=;i<=n;i++)
scanf("%d",&c[i]), sum+=c[i];
sort(c+,c+n+,cmp); int mmin=;
for(int i=;i*i<=sum;i++)
if(sum%i==)
{
if(i<mmin)
{
L=i, C=sum/i;
memset(v,false,sizeof(v));
if(dfs(,,)==true)mmin=min(mmin,i);
}
if(sum/i<mmin&&i*i!=sum)
{
L=sum/i, C=i;
memset(v,false,sizeof(v));
if(dfs(,,)==true)mmin=min(mmin,sum/i);
}
}
printf("%d\n",mmin);
}
return ;
}

poj1011

poj1190 这题简直就是剪枝的代表作了。。。我可以算是想出了1.5+2??个trick,但是这题整整五个剪枝啊!!!

1、大小,看到这个我都快条件反射了,管他有的没的倒序就是没错的

2、上下界,这个我想得还要复杂一点,导致有点难算,lyd就很暴力了直接开根

3、4、对于体积和表面积,到达目标的最小花费+当前花费比限制、当前最小花费大,那么就剪掉。我纠结了一会为啥一个叫可行性剪枝一个叫最优性剪枝,是因为体积是确定的而表面积是要求的

5、最***玄学的就是这个不等式了,上面全部的体积可以表示成sigema(1~dep-1)h[i]*r[i]^2,表面积就是2*sigema(1~dep-1)h[i]*r[i], 假设当前已经的体积为V

2*sigema(1~dep-1)h[i]*r[i] = 2/r[dep]*sigema(1~dep-1)h[i]*r[i]*r[dep] >= 2/r[dep]*sigema(1~dep-1)h[i]*r[i]*r[i] = 2*(N-V)/r[dep] 这个时候又可以判表面积。。。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int N,m,mmin,r[],h[];
int minV[],minS[];
void dfs(int k,int V,int S)
{
if(minV[k]+V>N)return ;
if(minS[k]+S>mmin)return ;
if(*(N-V)/r[k+]+S>mmin)return ;
if(k==)
{
if(minV[k]+V==N)mmin=min(mmin,S);
return ;
} int Rli=min( int(sqrt(double(N-V+))) , r[k+]- );
for(int R=Rli;R>=k;R--)
{
int Hli=min( (N-V)/(R*R) , h[k+]- );
for(int H=Hli;H>=k;H--)
{
r[k]=R;h[k]=H;
dfs(k-,V+R*R*H,S+*R*H+((k==m)?R*R:));
}
}
}
int main()
{
scanf("%d%d",&N,&m);
for(int i=;i<=m;i++)
minV[i]=i*i*i+minV[i-], minS[i]=*i*i+minS[i-]; mmin=;
r[m+]=h[m+]=;
dfs(m,,);
printf("%d\n",mmin);
return ;
}

poj1190

poj3076 状压,判点,判字母,绝望,留坟

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<bitset>
using namespace std; int cnt;
char ss[][],sc[][][];
bitset<>mp[][],tt[][][],ts[][][];
void init()
{
memset(mp,,sizeof(mp));
for(int j=;j<=;j++)//行
{
int zt=;
for(int i=;i<=;i++)
if(ss[i][j]!='-')
zt|=(<<(ss[i][j]-'A'));
for(int i=;i<=;i++) mp[i][j]|=zt;
}
for(int i=;i<=;i++)//列
{
int zt=;
for(int j=;j<=;j++)
if(ss[i][j]!='-')
zt|=(<<(ss[i][j]-'A'));
for(int j=;j<=;j++) mp[i][j]|=zt;
}
for(int i=;i<=;i+=)
for(int j=;j<=;j+=)
{
int zt=;
for(int k=;k<=;k++)
for(int l=;l<=;l++)
if(ss[i+k-][j+l-]!='-')
zt|=(<<(ss[i+k-][j+l-]-'A'));
for(int k=;k<=;k++)
for(int l=;l<=;l++)
mp[i+k-][j+l-]|=zt;
} cnt=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
if(ss[i][j]=='-')cnt++;
mp[i][j].flip();
}
} bitset<>p;bool v[];
bool check()
{
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(mp[i][j]==&&ss[i][j]=='-')return false; for(int i=;i<=;i++)
{
p.reset();memset(v,false,sizeof(v));
for(int j=;j<=;j++)
{
if(ss[i][j]!='-')v[ss[i][j]-'A']=true;
else p|=mp[i][j];
}
for(int o=;o<=;o++)
if(p[o]==&&v[o]==false)return false;
}
for(int j=;j<=;j++)
{
p.reset();
for(int i=;i<=;i++)
{
if(ss[i][j]!='-')v[ss[i][j]-'A']=true;
else p|=mp[i][j];
}
for(int o=;o<=;o++)
if(p[o]==&&v[o]==false)return false;
}
for(int i=;i<=;i+=)
for(int j=;j<=;j+=)
{
p.reset();memset(v,false,sizeof(v));
for(int k=;k<=;k++)
for(int l=;l<=;l++)
{
if(ss[i+k-][j+l-]!='-')v[ss[i+k-][j+l-]-'A']=true;
else p|=mp[i+k-][j+l-];
}
for(int o=;o<=;o++)
if(p[o]==&&v[o]==false)return false;
}
return true;
}
void influence(int x,int y)
{
int o=ss[x][y]-'A';
for(int j=;j<=;j++)mp[x][j][o]=;
for(int i=;i<=;i++)mp[i][y][o]=; int i=((x-)/)*+,j=((y-)/)*+;
for(int k=;k<=;k++)
for(int l=;l<=;l++)
mp[i+k-][j+l-][o]=;
}
bool bk;
void dfs(int k,int dep)
{
if(bk==true)return ; memcpy(ts[dep],mp,sizeof(ts[dep]));
memcpy(sc[dep],ss,sizeof(sc[dep]));
bool qwq=true;
while(qwq)
{
qwq=false;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
if(ss[i][j]=='-'&&mp[i][j].count()==)
{
k--;qwq=true;
for(int o=;o<=;o++)
if(mp[i][j][o]==)
{
ss[i][j]='A'+o;
influence(i,j);
break;
}
}
}
for(int o=;o<=;o++)
{
for(int i=;i<=;i++)
{
int u=,jj;
for(int j=;j<=;j++)
if(mp[i][j][o]==)
{
u++;jj=j;
if(u==)break;
}
if(u==)
{
ss[i][jj]='A'+o;
influence(i,jj);
}
}
for(int j=;j<=;j++)
{
int u=,ii;
for(int i=;i<=;i++)
if(mp[i][j][o]==)
{
u++;ii=i;
if(u==)break;
}
if(u==)
{
ss[ii][j]='A'+o;
influence(ii,j);
}
}
for(int i=;i<=;i+=)
for(int j=;j<=;j+=)
{
int u=,ii,jj;
for(int k=;k<=;k++)
for(int l=;l<=;l++)
{
if(mp[i+k-][j+l-][o]==)
{
u++;ii=i;jj=j;
if(u==)break;
}
}
if(u==)
{
ss[ii][jj]='A'+o;
influence(ii,jj);
}
}
}
}//必定赋值
if(!check())
{
memcpy(mp,ts[dep],sizeof(mp));
memcpy(ss,sc[dep],sizeof(ss));
return ;
} if(k==)
{
bk=true;
for(int i=;i<=;i++)
{
for(int j=;j<=;j++)printf("%c",ss[i][j]);
printf("\n");
}
return ;
} int cc=,nx,ny;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(ss[i][j]=='-'&&mp[i][j].count()<cc)
{
cc=mp[i][j].count();
nx=i,ny=j;
}
for(int o=;o<=;o++)
if(mp[nx][ny][o]==)
{
memcpy(tt[dep],mp,sizeof(tt[dep]));
ss[nx][ny]='A'+o; influence(nx,ny);
if(check())
dfs(k-,dep+); ss[nx][ny]='-';
memcpy(mp,tt[dep],sizeof(mp));
} memcpy(mp,ts[dep],sizeof(mp));
memcpy(ss,sc[dep],sizeof(ss));
}
int main()
{
for(int i=;i<=;i++)scanf("%s",ss[i]+);
init(); bk=false;dfs(cnt,);
return ;
}

poj3076(TLE)

0x21 剪枝的更多相关文章

  1. α-β剪枝算法的java语言实现(非常实用)

    利用α-β剪枝算法,对下图所示的博弈树进行搜索,搜索得到根节点选择的走步,以及没有必要进行评估的节点,并求出给出在何处发生了剪枝,以及剪枝的类型(属于α剪枝还是β剪枝). 注:□表示MIN节点:○表示 ...

  2. Sicily 1153: 马的周游问题(DFS+剪枝)

    这道题没有找到一条回路,所以不能跟1152一样用数组储存后输出.我采用的方法是DFS加剪枝,直接DFS搜索会超时,优化的方法是在搜索是优先走出度小的路径,比如move1和move2都可以走,但是如走了 ...

  3. HDU5887 Herbs Gathering(2016青岛网络赛 搜索 剪枝)

    背包问题,由于数据大不容易dp,改为剪枝,先按性价比排序,若剩下的背包空间都以最高性价比选时不会比已找到的最优解更好时则剪枝,即 if(val + (LD)pk[d].val / (LD)pk[d]. ...

  4. HDU5937 Equation(DFS + 剪枝)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5937 Description Little Ruins is a studious boy, ...

  5. alpha-beta剪枝搜索

    •一种基于剪枝( α-βcut-off)的深度优先搜索(depth-first search). •将走棋方定为MAX方,因为它选择着法时总是对其子节点的评估值取极大值,即选择对自己最为有利的着法: ...

  6. POJ1190生日蛋糕[DFS 剪枝]

    生日蛋糕 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18236   Accepted: 6497 Description ...

  7. *HDU1455 DFS剪枝

    Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  8. HDU1010 DFS+剪枝

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  9. HDU 5113 dfs剪枝

    题意:告诉格子规格,颜色个数,以及每个颜色能涂得格子数目,问是否能够实现相邻两个格子的颜色数目不相同. 分析:因为数据很小,格子最多是5 * 5大小的,因此可以dfs.TLE了一次之后开始剪枝,31m ...

随机推荐

  1. cloudfoundry-----------service servicebroker 转载

    目前,CloudFoundry已经集成了很多第三方的中间件服务,并且提供了用户添加自定义服务的接口.随着Cloud Foundry的发展,开发者势必会将更多的服务集成进Cloud Foundry,以供 ...

  2. tp5数据库操作 模型层

    一.数据模型作用 相同功能代码不用重复写多次 二.创建方式 在模块下建立model文件夹,php文件,文件名为数据库表名,其中类为数据库表名,继承Model类,模型层即为此表 namespace ap ...

  3. canvas动画简单操作

    canvas动画 小球滚动效果 关键api: window.requestAnimationFrame(draw) 会递归调用draw函数,替代setInterval var x = 20; var ...

  4. 图片全屏轮播插件poposlides

    jQuery轻量级全屏自适应焦点图插件poposlides 在线演示本地下载

  5. ubuntu+win10双系统,调整分区大小后进入了emergency mode

    问题背景: 装了Ubuntu+win10双系统,在Ubuntu下面挂载了Windows的D盘.后来因为D空间不够,进入Windows压缩C盘分区,扩大了D盘.重启后无法启动Ubuntu,进入了emer ...

  6. Ajax内容签名技术(减少无谓流量损耗)

    UI界面Ajax获取数据内容的时候,一般是直接加载内容填充,不管内容有无变化.自己也是一直这么干,包括定时刷新公告等.今天在浏览器控制台调试的时候,发现动态刷新内容,其实挺耗费流量的,特别是内容无变化 ...

  7. Javaee 内部引用

    1.final修饰类,修饰方法,修饰变量有什么特点? final修饰的类不能被继承太监类,可以被继承使用但不能修改,如果父类没有final修饰的方法子类可以添加上,成员变量需要在建类前被赋值且不能改动 ...

  8. 洛谷P3113 [USACO14DEC]马拉松赛跑Marathon_Gold 线段树维护区间最大值 模板

    如此之裸- Code: #include<cstdio> #include<cstring> #include<cmath> #include<algorit ...

  9. DAO DTO VO BO

    DAO叫数据访问对象DTO是数据传输对象DAO通常是将非对象数据(如关系数据库中的数据)以对象的方式操纵.DTO通常用于不同层(UI层.服务层或者域模型层)直接的数据传输,以隔离不同层,降低层间耦合 ...

  10. Linux crontab 在每月最后一天执行

    59  23 * * * if [ `date +%d -d tomorrow` = 01 ]; then; command(/usr/bin/curl -s -o temp.txt  http:// ...