重复覆盖问题

一、介绍:

重复覆盖问题:如下例题对应的图,选取几行,使得每一列都有一个1

精确覆盖问题:如下例题对应的图,选取几行,使得每一列都只有一个1

目前有一个解决这两类问题最快的一个算法:Dancing Links,但是难写难调

二、经典做法:DFS

每一次找到一个未被覆盖的列,枚举所有包含这一列的行,接着递归下一列

三、优化:

1、迭代加深(首先先看有没有选一行的答案,再看有没有选两行的答案......)

2、每次找到选择最少的列(若选了这一行,剩余需要覆盖的列数最少)

3、可行性剪枝(至少选多少行和剩余的行数比较)

4、位运算(同费解的开关)

1和3一起被称作IDA*

例题:

                                                               糖果

糖果店的老板一共有 M 种口味的糖果出售。

为了方便描述,我们将 M 种口味编号 1∼M。

小明希望能品尝到所有口味的糖果。

遗憾的是老板并不单独出售糖果,而是 K 颗一包整包出售。

幸好糖果包装上注明了其中 K 颗糖果的口味,所以小明可以在买之前就知道每包内的糖果口味。

给定 N 包糖果,请你计算小明最少买几包,就可以品尝到所有口味的糖果。

输入格式

第一行包含三个整数 N,M,K。

接下来 N行每行 K这整数 T1,T2,⋅⋅⋅,T,代表一包糖果的口味。

输出格式

一个整数表示答案。

如果小明无法品尝所有口味,输出 −1。

数据范围

1≤N≤100
1≤M,K≤20
1≤Ti≤M

输入样例:

6 5 3
1 1 2
1 2 3
1 1 3
2 3 5
5 4 2
5 1 2

输出样例:

2

 代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>

using namespace std;

const int N=110,M=1<<20;

int n,m,k;
vector<int> col[N];//记录该列可以选哪一行
int log2[M];

int lowbit(int x)
{
   return x&-x;
}

int h(int state)//估价函数,判断最少需要几行
{
    int res=0;
    for(int i=(1<<m)-1-state;i;i-=lowbit(i))
    {
        int c=log2[lowbit(i)];
        res++;
        for(auto row:col[c]) i&=~row;
    }
    return res;
}

bool dfs(int depth,int state)
{
    if(!depth||h(state)>depth)//判断是否每一列都被覆盖了
      return state==(1<<m)-1;
    
    //找到选择性最少的一列
    int t=-1;
    for(int i=(1<<m)-1-state;i;i-=lowbit(i))
    {
        int c=log2[lowbit(i)];
        if(t=-1||col[t].size()>col[c].size())
          t=c;
    }

    //枚举选哪行
    for(auto row:col[t])
      if(dfs(depth-1,state|row))
        return true;

    return false;
}

int main()
{
    cin>>n>>m>>k;

    for(int i=0;i<m;i++) log2[1<<i]=i;
    for(int i=0;i<n;i++)
    {
        int state=0;
        for(int j=0;j<k;j++)
        {
            int c;
            cin>>c;
            state|=1<<c-1;//标志第c-1位为1
        }

        for(int j=0;j<m;j++)//将当前状态记录进各列的可选择项中
        {
            if(state>>j&1)
              col[j].push_back(state);
        }
    }
      int depth=0;
        while(depth<=m&&!dfs(depth,0)) depth++;

        if(depth>m) depth=-1;
        cout<<depth<<endl;

        return 0;
}

课程说明 1 课程介绍 1 课程目标 1 相关资料 1 第1章 概述 2 第2章 覆盖问题的网络优化解决流程 3 2.1 基站开通一段时间后覆盖范围变小的问题 3 2.1.1 检查是否存在干扰和电磁环境较差使整个区域底噪较高 3 2.1.2 检查操作维护台是否有天馈的驻波告警和主分集接受告警信息 4 2.1.3 检查影响覆盖的参数是否设置合理 4 2.1.4 检查基站天线的倾角和方位角等工程参数 4 2.1.5 检查基站发信机机顶输出功率 4 2.1.6 检查基站的接收灵敏度是否正常 4 2.1.7 使用SITEMASTER进一步检查驻波比是否小于1.5 5 2.1.8 检查塔放是否工作正常 5 2.1.9 检查问题小区建筑物情况 5 2.1.10 检查基站天线的周围情况 5 2.1.11 检查传播环境的变化 5 2.2 基站扩容带来的覆盖问题 5 2.2.1 检查扩容前后的合路器是否存在差异 6 2.2.2 检查是否存在干扰和电磁环境较差使整个区域底噪较高 6 2.2.3 检查操作维护台是否有天馈的驻波告警和主分集接受告警信息 6 2.2.4 小区天馈方向是否有接反现象 6 2.2.5 检查新增天线选型是否合理 8 2.2.6 检查新增天线的安装是否满足要求 8 2.2.7 检查全向双发天线BCCH载频发射天线所处的位置 9 2.2.8 在采用了定向双发天线时要检查两个定向天线的俯仰角和方位角是否一致 9 2.2.9 检查基站发信机机顶输出功率 9 2.2.10 检查基站的接收灵敏度是否正常 9 2.2.11 检查塔放是否工作正常 9 2.2.12 当采用追求最大覆盖的配置方案时要检查不同载频的机顶输出功率 9 2.3 搬迁、新建基站带来的覆盖问题 10 2.3.1 检查搬迁基站在搬迁前后天线的方位角及挂高是否一致 10 2.3.2 搬迁网络定向天线倾角问题 10 2.3.3 检查搬迁基站的机顶功率与原有基站的机顶功率是否一致 10 2.3.4 检查基站的接受灵敏度是否正常 10 2.3.5 检查是否存在干扰和电磁环境较差使整个区域底噪较高 10 2.3.6 检查操作维护台是否有天馈的驻波告警和主分集接受告警信息 10 2.3.7 检查影响覆盖的参数设置是否合理 10 2.3.8 基站投入运行或搬迁新建后检查新增天线的安装是否满足要求 10 2.3.9 检查新增天线选型是否合理 11 2.3.10 检查全向双发天线的BCCH载频发射天线所处位置 11 2.3.11 在采用了定向双发天线时要检查两个定向天线的俯仰和方位角是否一致 11 2.3.12 检查小区天馈方向是否有接反现象 11 2.3.13 检查塔放是否工作正常 11 2.3.14 当采用追求最大覆盖的配置方案时要检查不同载频的机顶功率情况 11 第3章 现网覆盖问题解决的典型方法 12 3.1 基站版本升级 12 3.2 全向站问题 12 3.2.1 减少塔体对覆盖形成的阴影 12 3.2.2 检查是否可以通过加大基站的机顶功率得到解决 13 3.2.3 采用零点填充天线和内置下倾天线解决高山全向站的塔下黑问题 14 3.2.4 采用全向改定向的方法解决覆盖问题 15 3.3 定向站的覆盖问题 15 3.3.1 通过天线下倾角的调整解决 15 3.3.2 通过加大基站的机顶功率得到解决 16 3.3.3 采用高增益、水平波瓣较宽的天线解决覆盖问题 17 第4章 影响覆盖的常见问题和解决办法 19 4.1 天线进水 19 4.2 天线无源互调 19 4.3 天线选用不当 19 4.4 铁塔对全向天线辐射的影响 20 4.5 天馈安装问题 21 4.5.1 定向天线安装问题 21 4.5.2 全向天线安装问题 22 4.5.3 天馈、合路器(分路器)、CDU连接存在问题 23 4.6 塔放问题 24 4.7 基站前端模块在工程应用中影响覆盖的常见问题 25 4.7.1 隔离器损坏 25 4.7.2 双工器或其它滤波器损坏 25 4.7.3 驻波比误告警 25 4.7.4 LNA损坏 25 4.7.5 TRX和HPA输出功率小 25 4.8 影响覆盖的参数设置 25 第5章 覆盖案例介绍 29 5.1 案例一 采用预置下倾角全向天线天线 29 5.2 采用天线赋形技术 30 5.3 全向天线安装问题 30 5.4 合路器引起的上行损耗增大 31 5.5 TRX引起的上行覆盖差 33 第6章 附录A手机的信号强度指示 34
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值