软件设计师_算法——下午题(第四题)

回溯法(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<stdio.h>

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;
    }
}

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<stdio.h>
#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)--
}

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

  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要什么自行车儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值