// 1. dfs 顺序: 枚举可能的 r,h 拼成一层蛋糕 (顺序是层内操作)

// 2. dfs 状态: preR, preH, 当前层,累计体积,累计面经 (状态是分支和给下次的依赖值)

// (为什么穿入preR, preH 而不是 r,h? 因为r,h不是固定值,是需要遍历的,穿入上层的值也只是作为题目要求的剪枝边界)

// 3. 剪枝:

// 3.1 优化搜索顺序:r,h ,level都从大到小搜索, 因为r^2 权重比h大,所以还有先搜索r

// 3.2 可行性剪枝:

// 3.2.1 & 3.2.2 :累计超出最大体积;累计超出最小表面积;

// 原理是最小的r和h都是当前层数(1~m),因为题中要求:当i < M时,要求Ri > Ri+1且 Hi > Hi+1

// 3.2.3 : 上下界 :curR 上界为 r = Math.min(preR-1, (int)Math.sqrt(n-preV)), 下界为level

// curH 上界为 h = Math.min(preH-1, (n-preV)/r/r) , 下界为 level

// 原理是 V = r^2 * h

// 3.3 最优化剪枝: 根据 表面积与体积不等式推导而出

// ================================

// 搜索状态:

// 搜索状态可视为一个多元组,每一维都是问题状态空间的一个维度,

// 在题目中,一般在“输入变量”, “限制条件”, “待求解变量”等关键位置体现

//

// 搜索剪枝:

// 1. 针对每个状态进行缩放对边界进行推导 (可行性)

// 2. 对未来的最小代价进行计算 (最优化)

import java.util.*;

public class Main{

void run(){

int n = jin.nextInt();

int m = jin.nextInt();

for(int i = 1 ;i <= m ; i++){

mins[i] = mins[i-1] + i*i*2;

minv[i] = minv[i-1] + i*i*i;

}

System.out.println(solve(n, m));

}

int solve(int n, int m){

// dfs2(n, (int)Math.sqrt(n), m, 0, 0, n, m);

dfs(Integer.MAX_VALUE, Integer.MAX_VALUE, m, 0, 0, n, m);

return res;

}

void dfs(int preR, int preH, int level, int preV, int preS, int n, int m){

if (preV + minv[level] > n) return ;

if (preS + mins[level] > res) return ;

if (preS + 2*(n-preV) / preR >= res) return ;

if (level == 0 ){

if (preV == n){

res = Math.min(res, preS);

}

return ;

}

for (int r = Math.min(preR-1, (int)Math.sqrt(n-preV)); r >= level; r--){

for (int h = Math.min(preH-1, (n-preV)/r/r); h >= level ;h--){

dfs(r, h, level-1, preV+r*r*h, preS+2*r*h+(level==m?r*r:0), n, m );

}

}

return ;

}

void dfs2 (int r, int h, int level, int preV, int preS, int n, int m){

if (level == 0 ){

if (preV == n){

res = Math.min(res, preS);

}

return ;

}

// int curV = r*r*h; // 错误原因是 这个是上一个的值

// int curS = 2*r*h; // 不能开始就认为 r,h 是本层的值,

// 因为本层的值有多种可能需要遍历,最初的时候没法传入,而认为是上一层的值可以传哨兵

// if (level == m-1) curS += r*r;

for (int i = r-1 ;i > 0 ; i--){

for (int j = h-1 ; j>0 ; j--){

// dfs2(i, j, level-1, preV+curV, preS+curS, n, m); // 其实这里传入的也是上一次的值

dfs2(i, j, level-1, preV+i*i*j, preS+2*i*j+(level==m?i*i:0), n,m);

}

}

}

private int[] mins = new int[22];

private int[] minv = new int[22];

private int res = Integer.MAX_VALUE;

private Scanner jin = new Scanner(System.in);

public static void main(String[] args) throws Exception {new Main().run();}

}

java语言生日蛋糕代码_AcWing 168. 【Java】生日蛋糕相关推荐

  1. java代码安全检测机制,下列选项中,属于Java语言的代码安全检测机制的一项是______。A.动态链接B.访问权限的检查C.通过接...

    下列选项中,属于Java语言的代码安全检测机制的一项是______.A.动态链接B.访问权限的检查C.通过接 更多相关问题 Schema类型定义中当需要基于内置的基本数据类型定义一个新的数据类型时,用 ...

  2. java语言的特点简单性,Java语言的特点

    Java是一门面向对象编程语言,底层是C++语言.Java语言分为三大体系: • Java SE(标准版) • Java EE(企业版) • Java ME(微型版) Java语言的特点有以下几种: ...

  3. 《快乐编程大本营》java语言训练班-第4课:java流程控制

    <快乐编程大本营>java语言训练班-第4课:java流程控制 第1节. 顺序执行语句 第2节. 条件分支语句:if条件语句 第3节. 条件分支语句:switch 条件语句 第4节. 条件 ...

  4. 帮做Java_代写Heuristics、代做SAT、代写Java语言设计、代做Java代做Prolog|帮做Haskell程序...

    代写Heuristics.代做SAT.代写Java语言设计.代做Java代做Prolog|帮做Haskell程序Heuristics and OptimizationLab assignment #2 ...

  5. 验证码短信 API 接入指南:Java 语言示例代码

    短信验证码是一种通过短信发送的验证码,通常用于验证用户的身份.保障账户安全和防止恶意攻击等.短信验证码已经成为现代社会中不可或缺的一部分,广泛应用于各种场景,包括用户注册和登录.找回密码等等. 为了满 ...

  6. java调节音量代码_用Java调用VC音量控制程序_java

    前言 本文通过java的Runtime接口来实现调用其他语言实现的应用程序,进而来实现对计算机硬件信息的监控和控制.本文是多媒体信息系统的一个部分,就是调整计算机音量. 使用VC编写音量控制程序 本控 ...

  7. java语言主要因为具备了,Java语言的魅力

    Java语言的简介Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面向 ...

  8. Java语言特性运用:各种Java语法特性是怎样被Spring各种版本巧妙运用的?

    Java语法变化 Java5(2004): 枚举.泛型.注解.封箱(解箱)- Java6(2006): @Override接口 Java7(2011): Diamond语法.多Catch.Try- J ...

  9. java语言 编译原理_【Java学习】深入分析Java的编译原理

    在<Java代码的编译与反编译>中,有过关于Java语言的编译和反编译的介绍.我们可以通过javac命令将Java程序的源代码编译成Java字节码,即我们常说的class文件.这是我们通常 ...

最新文章

  1. SOTA论文也未必能被接收,谷歌科学家Eric Jang谈顶会审稿标准
  2. R语言ggplot2可视化图中添加希腊字母实战
  3. ConcurrentHashMap总结
  4. flask blueprint/蓝图 基础
  5. Java POI操作Excle工具类
  6. [python](爬虫)如何使用正确的姿势欣赏知乎的“长得好看是怎样一种体验呢?”问答中的相片...
  7. 根据压缩后的行列数和sourcemap反向定位源码
  8. -webkit-filter是神马?
  9. oracle查看视图数据,查看oracle 10g 视图-数据库专栏,ORACLE
  10. php 条码打印控件,jQuery插件jquery-barcode实现条码打印的方法
  11. 利用mysql5.6 的st_distance 实现按照距离远近排序。 (转载)
  12. L2-016 愿天下有情人都是失散多年的兄妹(DFS)
  13. [20个项目学会BBC micro:bit编程] 12-蜂鸣器控制
  14. SQLyog安装教程详解
  15. list集合去重和排序
  16. 批处理访问域服务器文件夹,批处理如何访问域共享文件夹
  17. 京城最有情调的14家餐厅
  18. 信息系统集成监理费收取标准_关于发布《信息系统工程监理及相关信息技术经验咨询服务取费计算办法(参照标准)》的通知...
  19. 关于在CSDN中写博客时如何插入图片
  20. SOEM 源码解析 ecx_FPWR

热门文章

  1. STM32串口编程易错点
  2. redmine 自己定义字段mysql表结构
  3. java String 常用方法集合
  4. [转载] 康威的人生游戏与轻量级模式
  5. 聊一聊FPGA的片内资源相关知识
  6. MATLAB 程序出现错误总结
  7. [带权并查集] Jzoj P1503 体育场
  8. 树莓派3B 开启串口
  9. App 更换应用图标
  10. 比较三个数的大小,让其按大小顺序排列