FZU - 2254 英语考试

在过三个礼拜,YellowStar有一场专业英语考试,因此它必须着手开始复习。

这天,YellowStar准备了n个需要背的单词,每个单词的长度均为m。

YellowSatr准备采用联想记忆法来背诵这n个单词:

1、如果YellowStar凭空背下一个新词T,需要消耗单词长度m的精力

2、如果YellowSatr之前已经背诵了一些单词,它可以选择其中一个单词Si,然后通过联想记忆的方法去背诵新词T,需要消耗的精力为hamming(Si, T) * w。

hamming(Si, T)指的是字符串Si与T的汉明距离,它表示两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。

由于YellowStar还有大量繁重的行政工作,因此它想消耗最少的精力背诵下这n个单词,请问它最少需要消耗多少精力。

Input

包含多组测试数据。

第一行为n, m, w。

接下来n个字符串,每个字符串长度为m,每个单词均为小写字母'a'-'z'组成。

1≤n≤1000

1≤m, w≤10

Output

输出一个值表示答案。

Sample Input

3 4 2
abch
abcd
efgh

Sample Output

10

Hint

最优方案是:先凭空记下abcd和efgh消耗精力8,在通过abcd联想记忆去背诵abch,汉明距离为1,消耗为1 * w = 2,总消耗为10。

题解:

把每个单词看成一个点,建立所有点间的边,边为min(M,hamming(Si, T) * W)。之后就是基础的最小生成树了。

代码:prim算法

#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

const int MAXN = 1005;
const int INF = 0x3f3f3f3f;

int N,M,W;

struct Edge{
	int to;
	int value;
	int next;
}E[MAXN*MAXN];

int head[MAXN];
int top;

void Add(int from,int to,int value){
	E[++top].next = head[from];
	head[from] = top;
	E[top].value = value;
	E[top].to = to;
}

char board[MAXN][15];

int Compare(int a,int b){
	int ans = 0;
	for(int i=0 ; i<M ; i++){
		if(board[a][i] != board[b][i])++ans;
	}
	return ans;
}

bool book[MAXN];
int lenth[MAXN];

int prim(){
	memset(book,false,sizeof book);
	memset(lenth,0,sizeof lenth);
	book[1] = true;
	int ans = M;
	for(int i=head[1] ; i ; i=E[i].next){
		lenth[E[i].to] = E[i].value;
	}
	int minL = INF;
	int mint;
	for(int i=2 ; i<=N ; i++){
		for(int j=2 ; j<=N ; j++){
			if(book[j] == false && lenth[j]<minL){
				minL = lenth[j];
				mint = j;
			}
		}
		ans += minL;
		minL = INF;
		book[mint] = true;
		for(int k=head[mint] ; k ; k=E[k].next){
			if(book[E[k].to] == false && lenth[E[k].to] > E[k].value)lenth[E[k].to] = E[k].value;
		}
	}
	return ans;
}

void init(){
	memset(head,0,sizeof head);
	top = 0;
}

int main(){
	
	while(scanf("%d %d %d",&N,&M,&W)!=EOF){
		init();
		for(int i=1 ; i<=N ; i++)scanf("%s",&board[i]);
		for(int i=1 ; i<=N ; i++){
			for(int j=i+1 ; j<=N ; j++){
				int mid = min(M,Compare(i,j)*W);
				Add(i,j,mid);
				Add(j,i,mid);
			}
		}
		printf("%d\n",prim());
	}
	
	return 0;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 福州大学汇编语言期末考试历年来都是以实际操作为重点,考察学生对于汇编语言的运用能力和实践经验。考试内容主要包括单项选择、填空和编程题,其中单项选择和填空题主要考察学生对汇编语言基础知识的掌握程度,编程题则主要考察学生对实际问题的处理能力。 历年考试中,编程题主题涵盖了汇编语言的各个方面,如输入输出、数学运算、条件判断、循环控制和数组操作等,涉及到实际问题的解决和编程技巧的掌握。在编程题的设计中,难度逐年升高,难度适中,涵盖的知识点也更加广泛且实用。 此外,汇编语言期末考试还会考查学生对课程中实验的理解和应用,以及对常用工具集成开发环境MASM和汇编语言程序设计流程的掌握情况。这样的设计旨在促进学生在实际运用中理解和掌握汇编语言的基本原理,提高汇编语言程序设计的能力。 总之,福州大学汇编语言期末考试历年以实际操作为主要考核方式,通过提供各种实际问题设计编程题目,考察学生对汇编语言基础知识和实践经验的掌握情况,以此检验学生的实际运用能力和应用能力。 ### 回答2: 福州大学计算机系汇编语言是一门重要的计算机基础课程,教授学生如何理解计算机内部运行机制。该课程通常在每个学期末会进行考试,最终计入学生的总成绩中。 历年来,fzu汇编语言期末考试的难度相对较高,因此学生需要花费充分的时间和精力去复习,了解考试方向和内容。在考试中,学生需要熟悉汇编语言的基本概念和常用指令,能够写出程序并进行调试。 在考试内容上,历年来的考试题目都涵盖了汇编语言的总体知识点,例如CPU结构、数据存储方式、寻址方式、编程方法、中断和I/O等。考试题型包括选择题、填空题、简答题和编程题等多种形式。 考试中的复习重点包括:CPU基本结构和运行原理、汇编语言常用指令、寻址方式和程序调试方法等。由于该课程是计算机系的入门课程,因此对于学生后续学习计算机领域的课程和研究都至关重要。 总之,fzu汇编语言期末考试历年来难度较大,需要学生投入足够的时间和精力复习考试内容。但是学好这门课程对于学生通向计算机领域和进行相关领域研究具有极为重要的作用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值