• 软件设计师_算法——下午题


    回溯法(N皇后问题

    19年上半

    image-20221021151530161

    image-20221021151605236

    image-20221021151654356

    image-20221021151755944

    image-20221021132838323

    image-20221021140239650

    image-20221021142730369

    解析:分析题干:queen[i]表示第i个皇后的位置,表示第i个皇后放置在第i行的第queen[i]列

    (1):queen[i]==queen[j];这里的需求是检查已摆放的皇后是否在同一列或者是同一斜线上,||后面的abs(queen[i]-queen[j]==(j-i))查看已摆放的皇后是否在同一斜线上,代码的意思是,第i个皇后的列与第j个皇后的列的绝对值是否等于第j个皇后的行与第i个皇后的行的差值,相等的话就是在同一斜线;
    要查看是否在同一列只需要查看第i个皇后的列是否等于第j个皇后的列;

    (2):1;注释上说检查当前列是否能放置皇后,不能放返回0,能放返回1;

    (3):Place(j);要调用一下上面的plase方法来看当前位置是否可以摆放;

    (4):Nqueen(j+1);摆放下一个皇后的话就要递归调用一下当前方法Nqueen,也就是回溯;

    image-20221021132846912

    解析:(5):回溯法

    image-20221021132855658

    解析:(6):2 ;(7):(2,4,1,3)(3,1,4,2)

    分治法

    20年上半

    image-20221021143935873

    image-20221021143951908

    #include
    
    void shellsort(int data[],int n){
        int *delta,k,i,t,dk,j;
        k=n;
        delta=(int *)malloc(sizeof(int) * (n/2));
        
        i=0;
        do{
            --(1)--;
            delta[i++]=k;
    	}while(--(2)--);
        
        i=0;
        while((dk=delta[i])>0){/*步长赋值给了dk*/
            for(k=delta[i];k<n;++k)
                if(--(3)--){/*data[k-dk]>data[k]*/
                    t=data[k];
                    for(j=k-dk;j>=0&&t<data[j];j-=dk)
                        data[j+dk]=data[j];
                    --(4)--;/*data[j+dk]=t*/
                }
            ++i;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    image-20221021153020347

    解析:(1):k/=2或k=k/2;后一个增量是前一个增量的二分之一,每循环一次就让k除以2,再把k赋值给data[i];
    (2):k>1;因为步长序列除到最后是1,所以while循环的条件就是k>1;

    image-20221021174256996

    (3):data[k-dk]>data[k]
    (4):data[j+dk]=t

    image-20221021153719288

    解析:(5):小于;希尔排序时间复杂度平均O(n1.3),最好O(n),最坏O(n2);

    (6):

    image-20221021154050988

    image-20221021175246594

    解析:(7):(4,9,-1,8,20,7,15)

    动态规划(背包问题)

    21年下半

    image-20221021201015878

    #include
    #define N 100
    
    char A[N]="CTGA";
    char B[N]="ACGCTA";
    int d[N][N];
    
    int min(int a,int b){
        	return a<b?a:b;
    }
    
    int editdistance(char *str1,int len1,char *str2,int len2){
        int i,j;
        int diff;
        int temp;
        
        for(i=0;i<=len1;i++){
            d[i][0]=i;
        }
        
        for(j=0;j<=len2;j++){
            --(1)--;
        }
        
        for(i=1;i<=len1;j++){
            for(j=1;j<=len2;j++){
                if(--(2)--){
                    d[i][j]=d[i-1][j-1];
                }else{
                    temp=min(d[i-1][j]+1,d[i][j-1]+1);
                    d[i][j]=min(temp,--(3)--);
                }
            }
    	}
        return --(4)--
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    image-20221022092334130

    image-20221022103834529

    image-20221022103732963

    答案:(1):data[0][j]==j
    (2):str1[i-1]==str2[j-1]
    (3):d[i-1][j-1]+1
    (4):d[len1][len2](图中打错了)

    image-20221022103921681

    image-20221022112057869

    解析:(5):动态规划;(6):O(m*n)

    image-20221022103930388

    答案:(7):4

  • 相关阅读:
    第二周 优化算法实战
    Java并发技术基础
    Magento_CentOS安装
    Flink - 读取 Parquet 文件 By Scala / Java
    软件测试的发展与定义
    <C++>解密 构造函数和析构函数
    用MATLAB求解微分方程
    jenkins+ssh+Putty构建windows的IIS服务发布
    python环境迁移:从联网笔记本到离线服务器
    解决Microsoft Edge无法正常运行的有效方案分享!
  • 原文地址:https://blog.csdn.net/m0_59598325/article/details/127459560