AcWing 168. 生日蛋糕(搜索)

深度优先搜索 + 剪枝

原题链接

感悟:本题的小细节还挺多的,也正是利用这些题目给的小细节来增加剪枝条件的。这个题是我第一次遇到需要一些数学式子推到的题目,尽管不难,但第一次碰到也很蒙,虽然数学的学习还算可以,但应用到一些实际东西上还是无从下手,得加强加强。

NOTE
: 本题都带有pai,且题目最后不用输出,则一起全部舍去

题目思路
  • 搜索对象及顺序: 深度搜,肯定是对层数下手的,然后从下往上
  • 枚举对象及优化: 枚举r,h先r因为影响因子更大(v = r * r * h)
  • dfs 参数:void dfs(int u, int v, int s); //u当前深度,v当前体积,s当前面积
剪枝优化
  • 当前层的R,H的范围--与剩余体积,当前深度有关 (可行性)
    -- dep <= R <= min{ sqrt(n-v) , R[dep + 1] - 1 }
    -- dep <= H <= min{ (n-v)/r*r , H[dep + 1] - 1 }
  • 到达当前层的根据s,v看是否需要继续 (可行性,最优性)
    -- minv[dep] + v > n(总体积)
    -- mins[dep] + s >= ans(当前最优解)
  • 当前的s,v之间的关系 (可行性)
    -- s + 2*(n-v)/R[dep+1] >= ans 这个是最难想的,推导还变了型
证明

(到时候补一张图,确实有点麻烦)

ACcode

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

const int N = 25, INF = 1e9;//这种无穷挺好啊

int n, m;
int minv[N], mins[N]; //存放每层最小r,h
int R[N], H[N];       //存放枚举中使用的r,h,最后只会剩下一组最优解
int ans = INF;

void dfs(int u, int v, int s)
{
     //剪枝(可行性):当前层体积的极限关系
    if(minv[u] + v > n) return;    
     //剪枝(最优性):当前层面积与已知最优的关系
    if(mins[u] + s >= ans) return;
    
     //剪枝(可行性):当前体积与面积之间的关系
    if(s + 2*(n-v)/R[u+1] >= ans) return;
    
     //返回条件
    if(!u)
    {
        if(v == n) ans = s;
        return;
    }
    
     //枚举顺序:1.从大到小 2.先r后h
    for(int r = min((int)sqrt(n-v), R[u+1] - 1); r >= u; r--)
        for(int h = min((n-v)/(r*r), H[u+1] - 1); h >= u; h--)
        {
            int t = 0;
            if(u == m) t = r * r;
            R[u] = r; H[u] = h;
            dfs(u-1, v + r * r * h, s + 2 * r * h + t);
        }
}

int main()
{
    cin >> n >> m;
    
    for(int i = 1; i <= m; i++)
    {
        minv[i] = minv[i - 1] + i * i * i;
        mins[i] = mins[i - 1] + 2 * i * i;
    }
    
    R[m + 1] = H[m + 1] = INF;
    dfs(m, 0, 0);
    
    cout << ans << endl;
    
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 224,861评论 6 522
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,263评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,033评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,999评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,000评论 6 400
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,483评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,850评论 3 428
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,827评论 0 279
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,366评论 1 324
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,404评论 3 346
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,525评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,130评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,853评论 3 338
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,293评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,426评论 1 276
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,082评论 3 381
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,590评论 2 366

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,038评论 0 2
  • 对于 D 题的原题意,出题人和验题人赛前都没有发现标算存在的问题,导致了许多选手的疑惑和时间的浪费,在此表示真诚的...
    _Carryon阅读 261评论 0 0
  • 数据结构算法大全(用 PASCAL 描述) 1.数论算法 求两数的最大公约数 function gcd(a,b:i...
    心想事成_ae7e阅读 517评论 0 0
  • One 1 the [ðə, ði:] art.这,那 ad.[用于比较级;最高级前] 2 be [bi:,bi]...
    梁培林阅读 9,321评论 0 10
  • 春天是属于诗的 就似一首清新温暖的小诗 在唇间轻吟 便沁人心脾 风带走了噩梦和冰之歌 料峭再无 太阳洗了澡 和煦万...
    大橘黑科技阅读 131评论 0 0