博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1190生日蛋糕--DFS
阅读量:7061 次
发布时间:2019-06-28

本文共 993 字,大约阅读时间需要 3 分钟。

题目数据范围10000,因此简单的DFS会超时,所以要格外注意剪枝。

1.半径r,与高h都从n+1,开始搜索。

2.当前的表面积,加上之后层的预估最小表面积,若大于最优解,减掉。

3.当前的体积,加上之后层的预估最小体积,若大于最优解,减掉。

4.DFS中,若体积超出限制n,则减掉。

5.(目前体积-已有体积)/r*2+已有的表面积若大于已经得到过的S则减掉。

#include
int r[10001];int h[10001];int N,M,S;int miv[21];int mis[21];void dfs(int smm,int v,int dep,int h,int r){ if(v>N) return; if(dep==0){ if(v==N&&smm
N||smm+mis[dep-1]>=S||(N-v)/r*2+smm>S) return; for(int i=r-1;i>=dep;i--){ if(dep==M) smm=i*i; int mxh; if((N-v-miv[dep-1])/(i*i)>h-1) mxh=h-1; else mxh=(N-v-miv[dep-1])/(i*i); for(int j=mxh;j>=dep;j--){ dfs(smm+2*i*j,v+i*i*j,dep-1,j,i); } }}void mx(){ for(int i=1;i<=20;i++){ miv[i]=miv[i-1]+i*i*i; mis[i]=mis[i-1]+2*i*i; }}int main(){ scanf("%d %d",&N,&M); S=99999999;    mx(); dfs(0,0,M,N+1,N+1); if(S==99999999) S=0; printf("%d\n",S); return 0;}

 

转载于:https://www.cnblogs.com/lvcoding/p/6594327.html

你可能感兴趣的文章
每日一句(15)
查看>>
读书笔记--SQL必知必会--建立练习环境
查看>>
捕获、冒泡
查看>>
P3369 【模板】普通平衡树(Treap/SBT)
查看>>
【转】如何实现vb与excel的无缝连接
查看>>
[异常笔记]启动DFS报错:Cannot find configuration directory: /etc/hadoop
查看>>
Wwise Unreal Engine 集成代码浅析 (三)
查看>>
node.js-2
查看>>
关于Java日期的两道例题
查看>>
结队项目——第一次作业
查看>>
寻找逆序对
查看>>
关于取消TextFiled上面的灰色联想区域的问题
查看>>
Linux 配置jdk1.8
查看>>
PowerPC-MPC56xx Flash模式代码启动过程
查看>>
Oracle LPAD/RPAD函数在处理中文时的注意事项
查看>>
物理分页与逻辑分页
查看>>
【每天一道算法题】字符串查找
查看>>
多视图工作
查看>>
MySQL Notifier 缺少根元素解决方法
查看>>
CSS :focus 选择器
查看>>