1.你对贪心算法的理解
贪心算法是通过局部全优解来得到全局最优解的,每一步都是在当前状态下做出最好选择。在用贪心算法时,一般都需要排序。需要找出多种贪心策 略,通过找出反例来验证其可行性。
2.请选择一道作业题目说明你的算法满足贪心选择性质
题目描述:4-2 删数问题
给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法 找出剩下数字组成的新数最小的删数方案。
解题思路:
从数组的左边开始向右扫描,若是找到单调递减序列,就把这个序列的第一个数字删除,数组后面的数依次往前挪,长度-1;
若是找不到递减序列,就把非递减序列的最后一个数删掉,它为大数;
在删除个数仍小于k的情况下,重复以上步骤。
最后控制输出格式,从左开始扫描数组,直到去掉开头的‘0’,如‘001’的情况。
代码:
#include <iostream> #include <string.h> using namespace std; char a[1002]; int k; bool flag = false; int t = 0; int len ; int sum = 0; int deal() { while(k > 0) { for(int i=0; i<len; i++) { if (i == len - 1) { len--; break; }//没找到那个单调递减的第一个数,就删掉非递减序列的最后一个数。 else if (a[i] > a[i + 1]) { for (int j = i; j < len - 1; j++) { a[j] = a[j + 1]; //删掉一个,后面的全部前移一位。 } len--; //长度减一 break; } } k--; } return len; } int main() { cin >> a; cin >> k; len = strlen(a); int m = deal(); int j = 0; while(j < (m-1) && a[j] == '0'){ j++; } for(int i=j; i<m; i++) { cout << a[i]; } }
3.请说明在本章学习过程中遇到的问题及结对编程的情况
情况良好,本次结对编程交流了挺多思路,发现了许多以前没注意到的小细节。