Bootstrap

湖南大学16年算法设计与分析期末试题

有人看再发17年的,没人点赞评论就不发了

在这里插入图片描述

A[n]为齐王的n匹马,B[n]为田忌的n匹马
对于齐王的每匹马,判断田忌是否能赢,若不能赢,就选择当前速度最慢的马,若能赢,就选差值最小的能赢的马。
平局时,根据双方最后一匹马的快慢决定。

Int begin=0,end=n-1;
For(i=0;i<n;i++)
{
If(B[begin]>A[i])
{
For(j=begin;j<n;j++)
{
If(B[j]<A[i]) break;
}
X[i]=j-1;
B[j-1]=0;
Sort(B,B+n);
Begin++;
}
Else { X[i]=end; end–;}

在这里插入图片描述

// 状态 dp[i][j] : 表示 s 的前 i 个字符和 p 的前 j 个字符是否匹配 (true 的话表示匹配)
// 状态转移方程:
// 1. 当 s[i] == p[j],或者 p[j] == ? 那么 dp[i][j] = dp[i - 1][j - 1];
// 2. 当 p[j] == * 那么 dp[i][j] = dp[i][j - 1] || dp[i - 1][j] 其中:
// dp[i][j - 1] 表示 * 代表的是空字符,例如 ab, ab*
// dp[i - 1][j] 表示 * 代表的是非空字符,例如 abcd, ab*
// 初始化:
// 1. dp[0][0] 表示什么都没有,其值为 true
// 2. 第一行 dp[0][j],换句话说,s 为空,与 p 匹配,所以只要 p 开始为 * 才为 true
// 3. 第一列 dp[i][0],当然全部为false

在这里插入图片描述
从0到i对每个结点进行处理,解空间是一颗二叉树,套用回溯法子集树模板

在这里插入图片描述
每次都放最小的边,最后检查是否连通
elem_t prim(int n,elem_t mat[MAXN][MAXN],int* pre){
elem_t min[MAXN],ret=0,maxLen=-1;
int v[MAXN],i,j,k;
for (i=0;i<n;i++)
min[i]=inf,v[i]=0,pre[i]=-1;
for (min[j=0]=0;j<n;j++){
for (k=-1,i=0;i<n;i++)
if (!v[i]&&(k==-1||min[i]<min[k]))
k=i;
ret+=min[k];
if(maxLen < min[k]){
maxLen = min[k];
}
for (v[k]=1,i=0;i<n;i++)
if (!v[i]&&mat[k][i]<min[i])
min[i]=mat[pre[i]=k][i];
}
return maxLen;
}

;