矩阵嵌套问题

Posted 木叶∞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵嵌套问题相关的知识,希望对你有一定的参考价值。

题意:有n个矩阵,每个矩阵可以用两个整数a、b描述,表示它的长和宽。矩阵X(a,b)可以嵌套在矩形Y(c,d)中,当且仅当a<c,b<d,或者b<c,a<d。输出最多嵌套的矩阵个数。

思路:如果矩阵X可以被Y嵌套,则相当于X到Y有一条路径,问题就转化成了在有向无环图中找最长路的问题。

      这个问题是动态规划的基础问题。这里用动态规划解决:

      设len(i)表示从结点i出发的最长路径长度。状态转移方程为:

      len(i) = max{len(j)+1|(i,j)∈E}

      E是边集。

实现:先把n个矩阵处理成一个邻接矩阵。

      然后用记忆化搜索的方法实现动态规划方程。

输入:

10
1 2
2 4
5 8
6 10
7 9
3 1
5 8
12 10
9 7
2 2

输出:  

   5

#include<iostream>
#include<memory.h>
using namespace std;

int gra[100][100];
int len[100];//从该点开始的最长路径长度
int n;

struct mat
{
    int a,b;
};

int f(int pos)
{
    if(len[pos] > 0)
    {
        return len[pos];
    }
    len[pos] = 1;
    for(int i = 0; i < n; i ++)
    {
        if(gra[pos][i])
        {
            len[pos] = max(len[pos], f(i) + 1);
        }
    }
    return len[pos];
}

int main()
{
    int ans = -1;
    cin >> n;
    mat nod[100];
    memset(gra, 0, sizeof(gra));
    memset(len, 0, sizeof(len));
    for(int i = 0; i < n; i ++)
    {
        cin >> nod[i].a >> nod[i].b;
    }
    for(int i = 0; i < n; i ++)
    {
        for(int j = 0; j < n; j ++)
        {
            if((nod[i].a < nod[j].a && nod[i].b < nod[j].b) || (nod[i].a < nod[j].b && nod[i].b < nod[j].a))
            {
                gra[i][j] = 1;
            }
        }
    }
    /*
    for(int i = 0; i < n; i ++)
    {
        for(int j = 0; j < n; j ++)
        {
            cout << gra[i][j] << ‘ ‘;
        }
        cout << endl;
    }
    */
    for(int i = 0; i < n; i ++)
    {
        ans = max(ans, f(i));
    }
    cout << ans << endl;
    return 0;
}

 

 

 

 

     

 

以上是关于矩阵嵌套问题的主要内容,如果未能解决你的问题,请参考以下文章

Android 动画嵌套片段

将片段添加到片段中(嵌套片段)

Recyclerview 滚动在嵌套滚动视图中的片段中不起作用

OpenMP 矩阵乘法嵌套循环

onActivityResult() 未在新的嵌套片段 API 中调用

访问嵌套片段的文本字段