算法分析与设计实验——递归与分治算法

实验目的和要求

(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学时,必做实验

数据结构与算法

  1. 最大字段和:

数据结构:

存储数据序列用数组a[]表示

Lefts表示左半部分字段和

Rights表示右半部分字段和

Midsum表示新字段和

算法:分治算法

  1. 骨牌覆盖

数据结构:

棋盘用二维数组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)

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值