算法系统学习-贪心策略(可绝对贪婪问题详解)

简介: 该系列是基于有一定语言基础(C,C++,Java等等)和基本的数据结构基础进行的算法学习专栏,如果觉得有点吃力 😥 ,建议先了解前提知识再学习喔!本个专栏会将用更容易理解的表达去学习算法,如果在一些表述上存在问题还请各位多多指点

可绝对贪婪问题


Case1:键盘输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次将组成一个新的正整数。对于给定的n和s,使得剩下的数字组成新数最小并输出。


问题分析:

在位数固定的前提下,让高位的数字尽量小,其值就越小,依据贪心策略就可以解决这个问题。但是数据的不同也会造成不同种情况的出现,例如 假设1,假设2,假设3

假设1:

n=“12435863” s=2(去掉两个数)

开始

第一次比较 “1 2 4 3 5 8 6”

1相对于2 在高位,但是数字小于低位的2, 所以不变

第二次比较“1 2 4 3 5 8 6”

2相对于4 在高位,但是数字小于低位的4 ,所以不变

第三次比较“1 2 4 3 5 8 6”

4相对于3 在高位,但是数字大于低位的4 ,所以4被移除。

第四次比较“1 2 3 5 8 6”

3相对于5 在高位,但是数字小于低位的5, 所以不变

第五次比较“1 2 3 5 8 6”

5相对于8 在高位,但是数字小于低位的8, 所以不变

第五次比较“1 2 3 5 8 6”

8相对于6 在高位,但是数字大于低位的8,所以8被移除。

最后输出 12356 为最小数

结束

因此,可得相邻数字只需要从前向后比较;


假设2:

n=“231183” s=3(去掉三个数)

开始

第一次比较 “2 3 1 1 8 3”

2相对于3 在高位,但是数字小于低位的3,所以不变

第二次比较“2 3 1 1 8 3”

即得“2 1 1 8 3”

3相对于1 在高位,但是数字大于低位的1,所以3被移除。

第三次比较“2 1 1 8 3”

2相对于1 在高位,但是数字大于低位的1,所以2被移除。

即得“ 1 1 8 3”

第四次比较“ 1 1 8 3”

1相对于1在高位,两者相等, 所以不变

第五次比较“ 1 1 8 3”

1相对于8在高位,但是数字小于低位的8, 所以不变

第六次比较“ 1 1 8 3”

8相对于1在高位,但是数字大于低位的1, 所以8被移除

即得“ 1 1 3”

最后输出 113 为最小数

结束

因此,可得当第i位与第i+1位比较,若删除第i位后,必须向前考虑第i-1位与第i+1位进行比较,才能保证结果的正确性。


假设3:

n=“123456” s=3(去掉三个数)

可以清楚的看到,相邻的数字比较都不用删除,这时要考虑将后三位删除,即为最小值为123

当然也还有另外一种可能

假设3-1

n="120083" s=3(去掉三个数)

3 比 0 大删除 即“1 0 0 8 3”

2比 0 大删除 即“ 0 0 8 3”

8比 3 大删除 即“ 0 0 3”

最小值3

由此,在n含有0时,当删除掉一些数字后,结果高位可能会出现数字0,直接输出这个数据不合理。应该将所有高位的0去除再输出。特别地还要考虑若结果串是0000时,不能将0都删除,而要保留一个“0”最后输出


因此,从以上假设来看,进行算法设计时,从具体到抽象的归纳一定要选取大量不同的实例充分了解和体会解决问题的过程,规律和各种不同情况,才能设计出正确的算法。


算法设计:

delete(char [],int b,int k){
int i;
    for(i=b;i<length(n)-k;i++){
        n[i]=n[i+k];
    }
main(){
char n[100];
    int s,i,j,j1,c,data [100],len;
  cin>>n>>s;//n 为正整数,去除s个数字
    len=length(n);
}
if(s>len){
cout<<"数据错误!";
    return;
}
    j1=0;
for(i=1;i<=s;i++){
    {for(j=1;j<length(n);j=j+1)
    {
    if(n[j]>n[j+1]){  //贪心选择
    delete(n,j,1);
    }
    if(j>j1){
    data[i]=j+i;    //记录删除数字的位置
    }else{      //假设2向前删除
    data[i]=data[i-1]-1;
    }
    j1=j;
    break;
    }
     if(j>length(n)){
     break;
     }
for(i=i;i<=s;i++){
j=len-i+1;
    delete(n,j,1);
    data[i]=j;
} while(n[1]='0' && length(n)>1){
    delete(n,1,1);  //将字符串首的若干“0”去掉
    cout<<n;
 for(i=1;i<=s;i++){
 cout<<data[i]<<'';
                            }
                        }
                    }
        }
}

综上所述:算法主要由四部分组成:初始化,相邻数字比较(必要时删除),处理比较过程中删除不够s位的情况和结果输出。

目录
相关文章
|
5天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
111 55
|
15天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
95 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
2天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
22 3
|
21天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
18天前
|
算法
通过matlab分别对比PSO,反向学习PSO,多策略改进反向学习PSO三种优化算法
本项目使用MATLAB2022A版本,对比分析了PSO、反向学习PSO及多策略改进反向学习PSO三种优化算法的性能,主要通过优化收敛曲线进行直观展示。核心代码实现了标准PSO算法流程,加入反向学习机制及多种改进策略,以提升算法跳出局部最优的能力,增强全局搜索效率。
|
17天前
|
算法 5G 数据安全/隐私保护
基于MIMO系统的PE-AltMin混合预编码算法matlab性能仿真
本文介绍了基于交替最小化(AltMin)算法的混合预编码技术在MIMO系统中的应用。通过Matlab 2022a仿真,展示了该算法在不同信噪比下的性能表现。核心程序实现了对预编码器和组合器的优化,有效降低了硬件复杂度,同时保持了接近全数字预编码的性能。仿真结果表明,该方法具有良好的鲁棒性和收敛性。
31 8
|
1月前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
|
16天前
|
存储 人工智能 缓存
【AI系统】布局转换原理与算法
数据布局转换技术通过优化内存中数据的排布,提升程序执行效率,特别是对于缓存性能的影响显著。本文介绍了数据在内存中的排布方式,包括内存对齐、大小端存储等概念,并详细探讨了张量数据在内存中的排布,如行优先与列优先排布,以及在深度学习中常见的NCHW与NHWC两种数据布局方式。这些布局方式的选择直接影响到程序的性能,尤其是在GPU和CPU上的表现。此外,还讨论了连续与非连续张量的概念及其对性能的影响。
41 3
|
16天前
|
机器学习/深度学习 人工智能 算法
【AI系统】内存分配算法
本文探讨了AI编译器前端优化中的内存分配问题,涵盖模型与硬件内存的发展、内存划分及其优化算法。文章首先分析了神经网络模型对NPU内存需求的增长趋势,随后详细介绍了静态与动态内存的概念及其实现方式,最后重点讨论了几种节省内存的算法,如空间换内存、计算换内存、模型压缩和内存复用等,旨在提高内存使用效率,减少碎片化,提升模型训练和推理的性能。
33 1
|
20天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
39 1
下一篇
DataWorks