切绳子算乘积

题目:

给你一段绳子,这段绳子的长度是正整数(绳子长度大于0),你可以选择切或者不切,如果切,分成两段,保证两段的长度都是整数,如果可以继续切,你可以选择继续,最后要求每一段绳子的长度的乘积最大。

思考一:

如果每次从中间切似乎得到的乘积会很大,那么当绳子长度为偶数,就直接从中间切,如果是奇数,那么奇数加1或者减1后再二分的位置切。

static int clacLen(int n) {
        if(n<=0) {
            return 0;
        } else if(n==1){
            return 1;
        } else if(n==2) {
            return 2;
        } else if(n==3){
            return 3;
        } else {
            if(n % 2 ==0) {
                return  Test.clacLen(n/2)*Test.clacLen(n/2);
            } else {
                return Test.clacLen((n-1)/2)*Test.clacLen((n+1)/2);
            }
        }
    }
测试数据
输入输出
56
69
7

12

816

输入5,6,7结果是对的,但是8就不对了,因为如果8拆分为3,3,2后,绳子长度乘积将是18。

思考2:

从思考1中可以发现,不仅仅要均分绳子,而且要保证在均分的条件下每一段的绳子长度最长,所有分到最后的结果是2或者3,如果能保证切分过程中得到更多的长度为3的绳子,那么就能保证每段绳子乘积最大。

static int clacLenEnhance(int n) {
        if(n<=0) {
            return 0;
        } else if(n>0 && n<5){
            return n;
        } else {
            return  Test.clacLenEnhance(3)*Test.clacLenEnhance(n-3);
        }
    }

采用递归算法,每次取一个3出来,这样就能保证最后绳子的长度乘积最大。这种思路就是用到了贪心算法:贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择。

测试结果
输入输出
56
69
712
818

思考3:

思考2看上去解题思路非常简单,但是要能迅速找到局部最优解是非常难得一件事件。怎么样在思考1的基础上能优化呢,还是采用二分法的思路,但是每做一步都要进行决策,选出每一步里面最优的解。

static int clacLenDP(int n) {
        if(n<=0) {
            return 0;
        } else if(n>0 && n<5){
            return n;
        } else {
            int [] array = new int[n+1];
            array[0]=0;
            array[1]=1;
            array[2]=2;
            array[3]=3;
            array[4]=4;
            int max = 0;
            for(int i=5; i<=n; i++){
                max = 0;
                for(int j=1; j<=i/2; j++){
                    int temp = array[j]*array[i-j];
                    if(temp>max){
                        max=temp;
                        array[i]=max;
                    }
                }
            }
            System.out.println("----------------------------");
            for(int k=0; k<=n; k++){
                System.out.println(array[k]);
            }
            return  array[n];
        }
    }

这次我们仅仅看看输入8的时候,最终把数组的每个值打印出来的结果

----------------------------
0
1
2
3
4
6
9
12
18
18

发现规律了吗?这个数组的每个值竟然是该值对应的数组下标作为绳子长度的时候的最长乘积。这里用到的就是动态规划算法,后面每一步都是基于前面每一步的结果,二者之间是有联系的。如果不明白,可以给大家推算下,当 i=8 之前,数组就存储了下面这些值:

----------------------------
array[0]   0
array[1]   1
array[2]   2
array[3]   3
array[4]   4
array[5]   6
array[6]   9
array[7]   12

当 i=8 的时候,在第2层for循环会做如下计算

a1*a7  1*12
a2*a6  2*9
a3*a4  3*4
a4*a4  4*4    

最终max选择的 2*9 = 18  作为 array[8] 的值。

总结:

今天讲了三种解法,两种算法,第一种解法是错误的,大家一定要注意。希望大家记住的是两种算法,在做算法题的时候优先考虑用这两种算法解题。

**项目概述:** 本资源提供了一套采用Vue.js与JavaScript技术栈构建的古籍文献文字检测与识别系统的完整源代码及相关项目文档。当前系统版本为`v4.0+`,基于`vue-cli`脚手架工具开发。 **环境配置与运行指引:** 1. **获取项目文件**后,进入项目主目录。 2. 执行依赖安装命令: ```bash npm install ``` 若网络环境导致安装缓慢,可通过指定镜像源加速: ```bash npm install --registry=https://registry.npm.taobao.org ``` 3. 启动本地开发服务器: ```bash npm run dev ``` 启动后,可在浏览器中查看运行效果。 **构建与部署:** - 生成测试环境产物: ```bash npm run build:stage ``` - 生成生产环境优化版本: ```bash npm run build:prod ``` **辅助操作命令:** - 预览构建后效果: ```bash npm run preview ``` - 结合资源分析报告预览: ```bash npm run preview -- --report ``` - 代码质量检查与自动修复: ```bash npm run lint npm run lint -- --fix ``` **适用说明:** 本系统代码经过完整功能验证,运行稳定可靠。适用于计机科学、人工智能、电子信息工程等相关专业的高校师生、研究人员及开发人员,可用于学术研究、课程实践、毕业设计或项目原型开发。使用者可在现有基础上进行功能扩展或定制修改,以满足特定应用场景需求。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值