算法第四章上机实验报告
给定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、贪心算法的理解
贪心算法总是做出当前最好的选择,只是某种意义上的局部最优解,如果我们要用贪心算法来解题,就要考虑结果是不是最优的,如果有别的算法的结果优于贪心算法的结果,这题就不能用贪心算法解。所以我们在考虑是否可以用贪心算法时 ,应该要时常举反例来证明贪心策略对不对,能否能用贪心策略。
贪心算法有两个性质,一个为贪心选择性质,另一个为最优子结构性质,与动态规划算法不同。