经典-动态规划-嵌套矩阵

两种解法,第一种是用DAG

#include <iostream>
#include <string.h>
#include <fstream>
using namespace std;
struct rectT
{
    int a,b;
};
int min(int a,int b)
{
    return a>b?b:a;
}
//s 代表以第 i个矩形为结尾的最长的。
int map[1005][1005],s[1005];
rectT rects[1005];
int dp(int i,int n)
{
    int temp;
    if(s[i]!=0)return s[i];
    s[i]=1;
    for(int j=1;j<=n;j++)
    {
        if(map[i][j]==1)
        {
            temp=dp(j,n);
            if(temp+1>s[i])s[i]=temp+1;
        }
    }
    return s[i];
}
int main()
{
    ifstream fin("ha.txt");
    int N,n,max=0;
    cin>>N;
    while(N--)
    {

        cin>>n;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)map[i][j]=99999999;
            map[i][i]=0;
        }
        for(int i=1;i<=n;i++)cin>>rects[i].a>>rects[i].b;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if((rects[i].a<rects[j].a&&rects[i].b<rects[j].b)||(rects[i].b<rects[j].a&&rects[i].a<rects[j].b))
                {
                    map[j][i]=1;
                }
            }
        }
        memset(s,0,sizeof(s));
        for(int i=1;i<=n;i++)dp(i,n);
        for(int i=1;i<=n;i++){if(s[i]>max)max=s[i];}
        cout<<max<<endl;
    }
}
    原文作者:动态规划
    原文地址: https://blog.csdn.net/u013480370/article/details/36920317
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞