《剑指offer》第十四题(剪绳子)
// 面试题:剪绳子
// 题目:给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n>1并且m≥1)。
// 每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]*k[1]*…*k[m]可能的最大乘
// 积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此
// 时得到最大的乘积18。 #include <iostream>
#include <cmath> // ====================动态规划====================
//四个特点;
//求问题最优解
//问题最优解可以分解为子问题的最优解
//可以分解为具有重复的子问题
//从上向下分析问题,从下向上计算问题 int maxProductAfterCutting_solution1(int length)
{
if (length < )//当大小小于3的时候可以直接得出
return ;
if (length == )
return ;
if (length == )
return ; int* products = new int[length + ];
products[] = ;
products[] = ;
products[] = ;
products[] = ; int max = ;
for (int i = ; i <= length; ++i)
{
max = ;
for (int j = ; j <= i / ; ++j)
{
int product = products[j] * products[i - j];//products[j]和products[i - j]都是已经得到的
if (max < product)
max = product; products[i] = max;//选择存起来每个子问题的最优解,提高效率
}
} max = products[length];
delete[] products; return max;
} // ====================贪婪算法====================
//需要数学底子,比如下面这个就得公式证明3(n-3)>=2(n-2),n>=5。。 int maxProductAfterCutting_solution2(int length)
{
if (length < )
return ;
if (length == )
return ;
if (length == )
return ; // 尽可能多地减去长度为3的绳子段
int timesOf3 = length / ; // 当绳子最后剩下的长度为4的时候,不能再剪去长度为3的绳子段。
// 此时更好的方法是把绳子剪成长度为2的两段,因为2*2 > 3*1。
if (length - timesOf3 * == )
timesOf3 -= ; int timesOf2 = (length - timesOf3 * ) / ; return (int)(pow(, timesOf3)) * (int)(pow(, timesOf2));
} // ====================测试代码====================
void test(const char* testName, int length, int expected)
{
int result1 = maxProductAfterCutting_solution1(length);
if (result1 == expected)
std::cout << "Solution1 for " << testName << " passed." << std::endl;
else
std::cout << "Solution1 for " << testName << " FAILED." << std::endl; int result2 = maxProductAfterCutting_solution2(length);
if (result2 == expected)
std::cout << "Solution2 for " << testName << " passed." << std::endl;
else
std::cout << "Solution2 for " << testName << " FAILED." << std::endl;
} void test1()
{
int length = ;
int expected = ;
test("test1", length, expected);
} void test2()
{
int length = ;
int expected = ;
test("test2", length, expected);
} void test3()
{
int length = ;
int expected = ;
test("test3", length, expected);
} void test4()
{
int length = ;
int expected = ;
test("test4", length, expected);
} void test5()
{
int length = ;
int expected = ;
test("test5", length, expected);
} void test6()
{
int length = ;
int expected = ;
test("test6", length, expected);
} void test7()
{
int length = ;
int expected = ;
test("test7", length, expected);
} void test8()
{
int length = ;
int expected = ;
test("test8", length, expected);
} void test9()
{
int length = ;
int expected = ;
test("test9", length, expected);
} void test10()
{
int length = ;
int expected = ;
test("test10", length, expected);
} void test11()
{
int length = ;
int expected = ;
test("test11", length, expected);
} int main(int agrc, char* argv[])
{
test1();
test2();
test3();
test4();
test5();
test6();
test7();
test8();
test9();
test10();
test11();
system("pause");
return ;
}
《剑指offer》第十四题(剪绳子)的更多相关文章
- 剑指offer——面试题14:剪绳子
// 面试题14:剪绳子 // 题目:给你一根长度为n绳子,请把绳子剪成m段(m.n都是整数,n>1并且m≥1). // 每段的绳子的长度记为k[0].k[1].…….k[m].k[0]*k[1 ...
- 【剑指offer】面试题 14. 剪绳子
面试题 14. 剪绳子 LeetCode 题目描述 给你一根长度为 n 的绳子,请把绳子剪成 m 段(m.n 都是整数,n>1 并且 m>1),每段绳子的长度记为 k[0],k[1],·· ...
- 《剑指offer》第四题(二维数组中的查找)
// 二维数组中的查找 // 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按 // 照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个 // 整数,判断数组 ...
- 剑指offer五十四之字符流中第一个不重复的字符
一.题目 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...
- 剑指offer二十四之二叉树中和为某一值的路径
一.题目 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 二.思路 详见代码 三.代码 1.解答代码 im ...
- 剑指offer三十四之第一个只出现一次的字符
一.题目 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置 二.思路 详见代码注释. 三.代码 import java.util. ...
- 剑指Offer(书):剪绳子
题目:给你一根长度为n的绳子,请把绳子剪成m段,每段绳子的长度记为k[0],k[1]....,k[m].请问k[0]xk[1]x...,k[m]可能的最大乘积是多少.例如:长度为8剪成2 3 3 得到 ...
- 《剑指offer》面试题14- I. 剪绳子
问题描述 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] .请问 k[0]*k[1]* ...
- 《剑指offer》面试题14- II. 剪绳子 II
问题描述 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] .请问 k[0]*k[1]* ...
- 剑指Offer(十八):二叉树的镜像
剑指Offer(十八):二叉树的镜像 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baidu ...
随机推荐
- C#在splitContainer1控件和panel控件中显示窗体
现在有两个窗体 Form1 和Form2 Form1中有控件splitContainer1 和panel .控件.我们希望Form2在splitContainer1或者panel控件中显示 1:首先看 ...
- Lintcode: First Position of Target (Binary Search)
Binary search is a famous question in algorithm. For a given sorted array (ascending order) and a ta ...
- meta 如何写
阻止手机号加下划线,可拨打:<meta name="format-detection" content="telephone=no" /> (io ...
- AOAPC I: Beginning Algorithm Contests (Rujia Liu) Volume 6. Mathematical Concepts and Methods
uva 106 这题说的是 说计算 x^2 + y^2 = z^2 xyz 互质 然后计算个数和 在 N内 不在 勾股数之内的数的个数 然后去找需要的 维基百科上 看到 另 n*m*2 =b ...
- hive支持sql大全(收藏版)
hive操作数据库还是比较方便的,因此才会有hbase与hive整合.下面我们hive的强大功能吧.为了增强阅读性,下面提几个问题: 1.hive支持哪些运算符? 2.hive是否支持左右连接? 3. ...
- Linux基础命令---eject
eject eject指令允许在软件控制下弹出可移动媒体(通常是光盘.软盘.磁带或Jaz或ZIP磁盘).该命令还可以控制一些由某些设备支持的自动弹出功能的多光盘转换器,并关闭一些光盘驱动器的盘. 对应 ...
- centos infiniband网卡安装配置
硬件:Mellanox InfiniBand,主要包括 HCA(主机通道适配器)和交换机两部分 软件:CentOS 6.4 MLNX_OFED_LINUX-2.1-1.0.0-rhel6.4-x86_ ...
- Python入门之logging日志模块以及多进程日志
本篇文章主要对 python logging 的介绍加深理解.更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件. 1. logging日志模块介绍 python ...
- Java HSSFworkbook,XSSFworkbook,SXSSFworkbook区别简述
Java HSSFworkbook,XSSFworkbook,SXSSFworkbook区别简述 一.HSSFworkbook,XSSFworkbook,SXSSFworkbook区别简述 用Java ...
- 20145118《Java程序设计》 第7周学习总结
20145118<Java程序设计> 第7周学习总结 教材学习内容总结 本周学习内容为第十三章,以下为教材内容重点总结: 1.格林威治标准时间简称GMT时间. 2.java.util.Da ...