实验目的和要求
(1)进一步掌握递归算法的设计思想以及递归程序的调试技术;
(2)理解这样一个观点:分治与递归经常同时应用在算法设计之中。
(3)分别用蛮力法和分治法求解最近对问题;
(4)分析算法的时间性能,设计实验程序验证分析结论。
实验内容
1、给定由n个整数组成的序列(a1, a2, …, an),最大子段和问题要求该序列形如ai+…+aj 的最大值(1≤i≤j≤n),当序列中所有整数均为负整数时,其最大子段和为0。
2、在一个2k×2k (k≥0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格。棋盘覆盖问题要求用4种不同形状的L型骨牌覆盖给定棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
实验环境
VS2010 或VC++
实验学时
2学时,必做实验
数据结构与算法
- 最大字段和:
数据结构:
存储数据序列用数组a[]表示
Lefts表示左半部分字段和
Rights表示右半部分字段和
Midsum表示新字段和
算法:分治算法
- 骨牌覆盖
数据结构:
棋盘用二维数组board[size][size]表示,size=2^k
特殊方格用用二维数组board[dr][dc]表示
L型骨牌:个数为(4^k-1)/3,用t表示
算法:分治算法
核心源代码
1.最大字段和:
#include<stdio.h>
int MaxSum(int a[],int left,int right){
int sum = 0,midsum = 0,leftsum = 0,rightsum = 0;
int center;
int s1 = 0,s2 = 0,lefts = 0,rights = 0;
if(left == right)
sum = a[left];
else{
center = (left+right)/2;
leftsum = MaxSum(a,left,center);
rightsum = MaxSum(a,center+1,right);
for(int i = center;i>=left;i--){
lefts += a[i];
if(lefts > s1)