ProDeveloperTutorial.com

教程和编程解决方案
菜单
  • Shell脚本
  • 系统设计
  • Linux系统编程
  • 4g LTE
  • 编码问题
  • C
  • C ++
  • DSA
  • GIT

动态编程:搭建桥梁

前开发者教程 2020年3月29日

在本教程中,我们将在DP的帮助下解决建筑桥梁的问题。这是一个经典的DP问题。

问题陈述:

在给定一条河的情况下,您需要以跨河的方式建造一座桥,这样,只有给定的一对人才能形成桥,并且任何桥都不应相互交叉。

 

例如,给定点[1,2] [5,4] [8,10],可以按以下方式形成桥:

 

动态编程:搭建桥梁

 

下面的桥无效

动态编程:搭建桥梁

上面的桥是无效的,因为桥[10,6]相交[8,10]。

 

顶部是北座标;底部是南坐标。

 

因此,根据给定的问题,您将获得一对,并且您需要通过满足上述条件来构建最大数量的桥。

 

我们将借助DP和最长的公共子序列来解决此问题。

 

此问题可以通过以下步骤解决:

  1. 将南坐标按升序排序。
  2. 找出最长的北坐标子序列
  3. 加入最长递增子序列中的桥。

 

例:

考虑如下坐标:

 

动态编程:搭建桥梁

 

步骤1:根据南座标排序

动态编程:搭建桥梁

 

步骤2:找出最长的递增子序列

 

在这里,排序顺序是最长的递增子序列。

动态编程:搭建桥梁

 

与原始的最长增加子序列算法进行比较时,变化很小。

 

即在原始算法中,只有下一个元素更大时,我们才选择该元素。但是这里我们也选择元素是否相等。

 

C ++解决方案

#include <iostream> 
  
using namespace std; 
  
// north-south bridge co-ordinates 

struct bridge_co_ordinates
{ 
    int north, south; 
}; 
  
// comparison function to sort bridge co ordinates
bool compare(struct bridge_co_ordinates a, struct bridge_co_ordinates b) 
{ 
    if (a.south == b.south) 
        return a.north < b.north; 
    return a.south < b.south; 
} 
  

int get_max_bridges(struct bridge_co_ordinates values[], int n) 
{ 
    int dp_array[n]; 
    for (int i=0; i<n; i++) 
        dp_array[i] = 1; 
          
    sort(values, values+n, compare); 
      
    // logic of longest increasing subsequence applied 上  the north coordinates 
    for (int i=1; i<n; i++) 
        for (int j=0; j<i; j++) 
            if (values[i].north >= values[j].north  
                && dp_array[i] < 1 + dp_array[j]) 
                dp_array[i] = 1 + dp_array[j]; 
          
          
    int max = dp_array[0]; 
    for (int i=1; i<n; i++) 
        if (max < dp_array[i]) 
            max = dp_array[i]; 
             
    return max;         
} 
  

int main() 
{ 
    struct bridge_co_ordinates values[] = {{3, 5}, {2, 4}, {2, 5}, {1, 2}}; 
    int n = 4; 
    cout << "Maximum number of bridges = " << get_max_bridges(values, n);     
    return 0; 
}

 

输出:

Maximum number of bridges = 4

 

该网站上可用的教程列表:

C编程20+章C ++编程80+章
100多个编码问题数据结构和算法85+章
系统设计20+章Shell脚本编写12章
4g LTE 60+章节最常见的编码问题
5G NR 50+章Linux系统编程20+章

 

分享
电子邮件
鸣叫
领英
Reddit
绊倒
Pinterest的
上一篇文章
下一篇

关于作者

前开发者教程

每天我们都会讨论竞争性编程问题,请加入我们的网站:   电报频道

ProDeveloperTutorial.com

教程和编程解决方案
版权© 2020 ProDeveloperTutorial.com
从以下课程获得热门课程: 教育性的
    <address class="s5SAwip"></address>

      <audio class="kvJRqyi"><nav id="XpmHyAa"></nav></audio>
    • <noscript id="zTN58iy" class="zFShAAP"><ul id="y4zeCyV"></ul></noscript>

        1. <object id="GeqNwym" class="Gkwe41m"><abbr id="abhZy8w"></abbr></object>

          <param class="VsyBnQ2"></param>




            <basefont id="S3f3Uuf"></basefont>
              <legend class="qIzoNjC"><q id="CeKErLR" class="CcyZwGW"><meter id="H3jgcpc" class="HZlUhzL"></meter></q></legend>
              <embed id="tTPvkgK" class="t7l2V7b"></embed>


              <article id="XWjwnhz" class="XoWGzhe"><source class="km7ZZSp"><cite class="TDcACoq"></cite></source></article>