算法第四章上机实验报告

算法第四章上机实验报告
 1、题目:

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

代码:

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char num[1000];
cin>>num;
int n;
bool flag=false;
cin>>n;
while(n>0)
{
int i=0;
while(num[i]!='\0'&&num[i+1]>=num[i])
{
i++;
}
for(int j=i;j<strlen(num);j++)
{
num[j]=num[j+1];

}
n--;

}


for(int i=0;i<strlen(num);++i)
{
if(num[i]!='0')
flag=true;
if(flag)
cout<<num[i];

}
}

2、贪心策略:依次删除递增序列中的最大值,直到删了k个数,再输出结果。

说明算法满足贪心选择性质:

贪心选择性质:在求解一个最优化的过程中,使用贪心的方式选择了一组内容之后,不会影响下面的子问题的求解。

在第一次删除递增序列中的最大值后,得到的值是删除一个数最小的数,不会影响删除两位数的结果。

123456

2

如在这个例子中删除第一个数字输出为12345

删除第二个数字输出为1234

3、时间复杂度

一个while循环中有一个while循环和一个for循环,在最坏情况下为O(N^3)

4、贪心算法的理解

贪心算法总是做出当前最好的选择,只是某种意义上的局部最优解,如果我们要用贪心算法来解题,就要考虑结果是不是最优的,如果有别的算法的结果优于贪心算法的结果,这题就不能用贪心算法解。所以我们在考虑是否可以用贪心算法时 ,应该要时常举反例来证明贪心策略对不对,能否能用贪心策略。

贪心算法有两个性质,一个为贪心选择性质,另一个为最优子结构性质,与动态规划算法不同。

 

posted @ 2021-11-14 21:50  难办  阅读(31)  评论(0编辑  收藏  举报