算法第四章作业
1.对贪心算法的理解
贪心算法作出在当前看来问题的最好选择。贪心算法并不是从整体考虑最优解,而是从局部出发选择的最优解。虽然对所有问题不一定是整体的最优解,但是在很多情况下都是整体最优或者是接近最优解。贪心算法,最重要的是找到这个问题的贪心策略,然后用反证法,替代法证明其正确性。
2.删数问题
问题描述
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。
输入格式:
第 1 行是1 个正整数 a。第 2 行是正整数k。
输出格式:
输出最小数。
输入样例:
在这里给出一组输入。例如:
178543 4
输出样例:
在这里给出相应的输出。例如:13
贪心策略:从高位开始找到连续递增的子序列,删掉子序列中最大数
#include<iostream> #include<cstring> using namespace std; //贪心思想:从高位开始找到连续递增的子段,删掉最最长字段的最大的数 int main(void) { char n[200]; int k; cin >> n >> k; int len=strlen(n); while(k)//不断改变数组的长度 { int i=0; while(n[i]<=n[i+1]) { i++; } while(i<len-1) { n[i]=n[i+1]; i++; } len--; k--; } int flag=0;//判断高位是不是0 shan for(int i=0; i<len; i++) { if(n[i]=='0'&&flag==0&&i<len-1) continue; else { cout << n[i]; flag=1; } } return 0; }
3.遇到的问题及结对编程的情况
贪心算法,在我看来就困难的是找到给出题目的贪心策略,并且要证明其正确性。就拿删除问题来说,本来一开始和搭档讨论是找到这个数组里面的最大值,然后删掉最大的,继续找第二大的数。这个策略在我们想来,确实是最直观最明朗的。但是在代码实现上,出现了很多的问题。首先是字符串的输入,没有想到直接应char[], 而是直接用了求余取个位数存进整型数组。 后来是对最大值的查找,用了多重循环,导致复杂度很高。输出的时候也存在问题。从这道题,我了解到自己在一些比较基础的问题上,还是存在不足。对于整型的应用多余字符串,所以导致一接触字符串就开始慌。
结对编程和搭档的合作越来越默契,所以希望下一次也能一起走花路。
最后,是对这一次期中考的总结。这次期中考,自己敲代码敲得非常差。其实自己也有在好好复习,也重新刷了pta的题目,以及去网上看了一些视频。但是对于期中考给出的动态规划的题目,还是敲得有点一言难尽。可能是自己确实没有真正的掌握把。还是会有一种很强的挫败感,希望下一次自己会越来越好。