美文网首页算法刷题
AcWing 168. 生日蛋糕(搜索)

AcWing 168. 生日蛋糕(搜索)

作者: 良木lins | 来源:发表于2020-04-03 16:08 被阅读0次

深度优先搜索 + 剪枝

原题链接

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

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;
}

相关文章

  • AcWing 168. 生日蛋糕(搜索)

    深度优先搜索 + 剪枝 原题链接 感悟:本题的小细节还挺多的,也正是利用这些题目给的小细节来增加剪枝条件的。这个题...

  • AcWing 167. 木棒(搜索)

    深度搜索 + 剪枝 感悟:开始的时候自己能写一些出来,基本就写个主函数,能想到两个剪枝条件,啊,还得加倍努力啊!!...

  • AcWing 166. 数独(搜索)

    深度优先搜索 原题链接 优化非常重要,在这题里更是如此 常见的优化技巧(本题前三种都有使用) 优化搜索顺序 排除冗...

  • AcWing 170. 加成序列(搜索)

    迭代加深 原题链接 感悟:之前用紫书学了下迭代加深,自我感觉应该还是可以的,这次在来实践的时候才发现,除了知道大概...

  • AcWing 165. 小猫爬山(搜索)

    深度优先搜索(dfs) 体会 要考虑的问题 枚举对象 dfs的参数 返回条件 剪枝技巧原题链接 枚举对象: 车...

  • 剑指week4

    1.二叉搜索树的后序遍历序列 [https://www.acwing.com/problem/content/44...

  • 2018-03-17

    视商168.

  • AcWing 171. 送礼物(搜索)

    深度优先 + 双向搜索 双向搜索:将整个需要搜索的对象分成两半(在已知初态与终态的时候可以考虑) 原题链接 感悟:...

  • AcWing 172. 立体推箱子(搜索)

    广度优先搜索 原题链接 感悟:这类题目的基本框架还是很简单的,剪枝都不用思考很多。但状态的表示是个难题,特别的麻烦...

  • 01背包问题(DP求解)

    acwing例题链接[https://www.acwing.com/problem/content/2/]

网友评论

    本文标题:AcWing 168. 生日蛋糕(搜索)

    本文链接:https://www.haomeiwen.com/subject/dunhphtx.html