第四章实践报告

  1. 你对贪心算法的理解

贪心算法符合最优子结构和贪心选择性质,通过局部求最优解逐步达成全局的最优解,每次都贪心选择当前情况下最优的解,再求解子问题的最优解。

但是贪心算法直接通过选择局部最优达到全局最优解,是需要证明其正确性的,如果找不出合适的贪心选择,则需要用动态规划法求解

  1. 请选择一道作业题目说明你的算法满足贪心选择性质

 

4-2 删数问题 (110分)

给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新 的正整数。对于给定的n位正整数a和正整数 k,设计一个算法找出剩下数字组成的新数最 小的删数方案。

输入格式:

第 1 行是1 个正整数 a。第 2 行是正整数k。

输出格式:

输出最小数。

输入样例:

在这里给出一组输入。例如:

178543

4

输出样例:

在这里给出相应的输出。例如:

13

  #include<iostream>

  #include<cstring>

  using namespace std;

  int main(){

        

        char m[20000];

        int k;

        cin>>m>>k;

        int cnt=strlen(m);

         //递减序列的话,删除最高位,那么剩下的就是最小的数, 754  删一个 54  

         int rec=cnt;

         int k1=k;

         while(k>0){//删除递减子序列的最高位  432123 4

                for(int i=0;i<cnt;i++){

                       if(m[i]>m[i+1]){

                              for(int j=i;j<cnt;j++){

                                     m[j]=m[j+1];

                              }

                              cnt--;

                              k--;

                              break;

                       }

 

 

                }

 

         }

 

         int s=rec-k;

         int j=0;//j用来遍历数组,因为可能会有0在数字前面,要从不为0的数字开始输出

         while(m[j]=='0') j++;

         for(int i=j;i<s;i++){

                cout<<m[i];

         }

         return 0;

  }

贪心策略:每次从头遍历整个数组,找出递减序列,把递减序列的第一个数删掉,并将剩余的数前移填补。

分析:由于找的是递减序列的第一个数,所以这个数对于这个序列来说一定是最高位的数,将递减序列的最高位删除,所剩下的数就是原序列所能删数的最小值,例如756,删除7,最小得56,通过局部递减序列的删数,最后得到的是一个完整的非递减序列,此时如果还没有删除足够的数字,那么就从这个序列的最后开始删,例如最后得到了12345,还差一个数字要删除,那么就删掉最后的5,得到1234,即是最优解,代码中实现是用了计算最后的序列的长度,直接输出序列长度。例如原序列是432123,要删掉4个数,则在过程中得到的非递减序列是123,还差一个要删,就直接输出6-2=2位数字即可,即输出12,3直接丢弃不输出。

  1. 请说明在本章学习过程中遇到的问题及结对编程的情况

这题在结对编程的过程中,没能够找到很好的贪心策略,1和3都很快的找到了思路并解答了,这题是后来通过查找网络,学习了一下,相互沟通了一下得解的。

posted @ 2020-11-11 22:36  鲤红  阅读(55)  评论(0编辑  收藏  举报