Num.4 分治算法
来源:互联网 发布:阿里云负责人 编辑:程序博客网 时间:2024/06/06 13:19
Num.4 分治算法
算法思路
使用分治法设计程序时,一般可按以下步骤进行:
- 分解:将要求解的问题划分成若干规模较小的同类问题;
- 求解:当子问题划分的足够小时,用较简单的方法解决;
- 合并:按求解问题的要求,将子问题的解逐层合并,即可构成最终的解。
举例说明:乒乓球比赛赛程
循环日程表(8人),每天每位选手比赛一场,怎样在最短时间内完成比赛?
#include "stdafx.h"#include <iostream>#include <stdio.h>using namespace std;#define MAXN 64int a[MAXN + 1][MAXN + 1] = { 0 }; //屏蔽0号元素void gamecal(int k, int n) //处理编号k开始的n个选手的日程{ int i, j; if (n == 2) { a[k][1] = k; //参赛选手编号 a[k][2] = k + 1; //对阵选手编号 a[k + 1][1] = k + 1; //参赛选手编号 a[k + 1][2] = k; //对阵选手编号 } else { gamecal(k, n / 2); //分治法,第一半 gamecal(k + n / 2, n / 2); //分治法,第二半 for (i = k; i<k + n / 2; i++) //填充右上角 { for (j = n / 2 + 1; j <= n; j++) a[i][j] = a[i + n / 2][j - n / 2]; } for (i = k + n / 2; i < k + n; i++) //填充左下角 { for (j = n / 2 + 1; j <= n; j++) a[i][j] = a[i - n / 2][j - n / 2]; } }}int main(){ int m, i, j; printf("参赛人数:"); scanf_s("%d", &m); j = 2; for (i = 2; i<8; i++) { j = j * 2; if (j == m)break; } if (i >= 8) { printf("参赛选手人数必须为2的整数次幂,且不超过64!\n"); getchar(); return 0; } gamecal(1, m); printf("\n编号"); for (i = 2; i <= m; i++) printf("%2d天 ", i - 1); printf("\n"); for (i = 1; i <= m; i++) { for (j = 1; j <= m; j++) printf("%4d", a[i][j]); printf("\n"); } while (getchar() != 'q'); return 0;}
阅读全文
0 0
- Num.4 分治算法
- Num.3 递归算法
- Num.1:递推算法
- Num.2 枚举(穷举)算法
- 分治算法
- 分治算法
- 分治算法?
- 【算法】分治
- 【算法】分治
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- 分治算法
- JAVA获取小程序的OpenId的实例详解上图
- CSAPP-Attack-Lab
- SSH与SSM学习之hibernate05——SessionFactory
- <c:if test="value ne, eq, lt, gt,...."> 用法
- 数组与矩阵---未排序数组中累加和为给定值的最长子数组系列问题
- Num.4 分治算法
- Improving Deep Neural Networks学习笔记(一)
- 事务、数据库事务、事务隔离级别、锁的简单总结
- char 与 unsigned char
- 新手起家之梦想飞航
- 十大算法
- 学习前辈系列:根据需求找代码
- Java中的注解详解
- Mybatis <where> <if> <set> <trim> <choose>标签