nyoj 16マトリクスネスト

4096 ワード

超経典の1つのテーマ
/*
    
  
 n   ,       a,b   ,     。  X(a,b)       Y(c,d)     a<c,b<d  b<c,a<d(     X90 )。  (1,5)     (6,2) ,      (3,4) 。                  ,        ,                 。
  
         N(0<N<10),        ,
                n,                (n<=1000)
   n ,      a,b(0<a,b<100),        
  
            ,             ,       
    
1
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 <algorithm>
#include <stdio.h>
#include <string.h>

using namespace std;

struct data
{
    int x;
    int y;
} a[1010];

int dp[1010];
int t,n;
///    ,   ( )    ,   ( )    ,         
bool comp(const data &a,const data &b)
{
    if(a.x < b.x || (a.x == b.x && a.y < b.y))
        return 1;
    return 0;
}

///             
bool judge(const data &a,const data &b)
{
    if(a.x < b.x && a.y < b.y)
        return 1;
    return 0;
}

int main()
{
    scanf("%d",&t);
    while(t --)
    {
        scanf("%d",&n);
        for(int i = 0; i < n; i ++)
        {
            scanf("%d%d",&a[i].x,&a[i].y);
            if(a[i].x > a[i].y)///         
                swap(a[i].x,a[i].y);
        }

        sort(a,a + n,comp);///  

        memset(dp,0,sizeof(dp));
        for(int i = 1; i < n; i ++)
            for(int j = 0; j < i; j ++)///  ,   j     i
                if(judge(a[j],a[i]) && dp[i] < dp[j] + 1)
                    dp[i] = dp[j] + 1;

        ///                    ,              
        int maxx = dp[0];
        for(int i = 1; i < n; i ++)
            if(maxx < dp[i])
                maxx = dp[i];
        printf("%d
",maxx + 1);/// 1 } return 0; }

メモリー検索+パス出力
//   :         ,       ,  
//     ,       ,                   ,           
  
#include<stdio.h>  
#include<string.h>  
  
#define MAXN 101  
int n, G[MAXN][MAXN];     //       
int x[MAXN], y[MAXN], d[MAXN];  //     
  
//               
int dp(int i)   
{         
    int j;  
    if(d[i] > 0)   
        return d[i];  //        ,        
  
    d[i] = 1;         //   ,  ,      
    for(j = 1; j <= n; j++)  
        if(G[i][j])   //      ,         
            if(d[i] <=dp(j)+1)     //           d(j)       d(i)  
                d[i]=dp(j)+1;      //   d[i]    
  
            return d[i];       //   d[i]  
}  
  
//                
/* 
      :              ,                
     d      ,     d[i]    i。      i,      i,         。 
     d(i) = d(j) +1  i, j ∈E      j,          ,      j 
*/  
void print_ans(int i)   
{     
    int j;  
    printf("%d ", i);    //    i          ,                
    for(j = 1; j <= n; j++)   
        if(G[i][j] && d[i] == d[j]+1)  //          , d[i] = d[j] +1  
        {  
            print_ans(j);           //        j       
            break;  
        }  
}  
  
int main()   
{  
    int i, j, t, ans, best;  
    scanf("%d", &n);            // n         
    //          ,           
    for(i = 1; i <= n; i++)   
    {  
        scanf("%d%d", &x[i], &y[i]);     //              
        if(x[i] > y[i])   
        {  
            t = x[i]; x[i] = y[i]; y[i] = t;   //   X[]    ,Y[]      
        }  
    }  
    memset(G, 0, sizeof(G));  //       
    for(i = 1; i <= n; i++)           //     
        for(j = 1; j <= n; j++)  
            if(x[i] < x[j] && y[i] < y[j]) G[i][j] = 1;  //    i          j ,       1  
              
            ans = 0;  
            for(i = 1; i <= n; i++)      //             
                if(dp(i) > ans)   
                {  
                    best = i;       // best         
                    ans = dp(i);  
                }  
                printf("ans=%d
", ans); // print_ans(best); printf("
"); while(1); return 0 ; }