zoukankan      html  css  js  c++  java
  • 各个击破的分治算法(四)

    一、分治算法的思想

      将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同,只要解决子问题,就可得到原问题的解。

    二、分治算法的解题过程

      (1)分解,将要解决的问题划分成若干个规模较小的同类问题。

      (2)求解,当子问题划分到足够小时,用简单的方法解决。

      (3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。

    三、实例演练

      欧洲冠军杯比赛日程安排

       代码实现:

    #include "stdio.h"
    #include "iostream"
    #define MAX 64 
    int a[MAX + 1][MAX + 1] = { 0 };
    void gamecal(int k, int n);//声明处理编号k开始的n个球队的日程
    int main()
    {
        int m, i, j;
        printf("参赛球队数:");
        scanf("%d", &m);
        j = 2;
        for (i = 2; i < 8;i++)
        {
            j = j * 2;
            if (j==m)
            {
                break;
            }
        }
        if (i>=8)
        {
            printf("参赛球队必须为2的整数次幂,并且不超过64!
    ");
            getchar();
            return 0;
        }
        gamecal(1, m);
        printf("
    编号");
        for (i = 2; i <= m;i++)
        {
            printf("%2d天", i - 1);
        }
        printf("
    ");
        for (i = 2; i <= m;i++)
        {
            for (j = 1; j <= m;j++)
            {
                printf("%4d", a[i][j]);
            }
            printf("
    ");
        }
        system("pause");
        return 0;
    }
    
    void gamecal(int k, int 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];
                }
            }
        }
    }

       实现结果:

    四、总结

      枚举、回溯、分治算法利用了计算机工作的第一个特点:高速,不怕数据量大。分治算法思想利用了计算机工作的第二个特点:重复。

  • 相关阅读:
    MySql 插入(insert)性能测试 zt 武胜
    mysql日期 武胜
    Some Useful Extension Methods On IList<T> zt 武胜
    SQL语句 武胜
    MySql bulk load zt 武胜
    C# 结构体初始化 武胜
    备忘 武胜
    C# 批量插入Mysql zt 武胜
    Use C# to get JSON Data from the Web and Map it to .NET Class => Made Easy! 转 武胜
    开发例子 转http://www.google.com.hk/search?newwindow=1&safe=strict&client=firefoxa&hs=Gzw&rls=org.mozilla%3AzhCN%3Aofficial&q=%E5%8D%83%E5%8F%91&oq=%E5% 武胜
  • 原文地址:https://www.cnblogs.com/hxf175336/p/9849809.html
Copyright © 2011-2022 走看看