zoukankan      html  css  js  c++  java
  • Arthur and Brackets

    n<605设计出n对夸号  给出n个条件每个条件为[l,r] 表示第i对夸号右夸号离左夸号的距离,然后夸号的右夸号出现的顺序必须按照给的顺序 出现, 那么如果存在就输出否则输出impossilbe , 我们知道如果一个夸号在 L位置,那么 另一个夸号就在 L+cnt 这个位置, 那么我们就可以知道在L=1 和L+cnt-1 这之间的夸号只要合法就可以了

    #include <iostream>
    #include <cstdio>
    #include<algorithm>
    #include <string.h>
    using namespace std;
    int dp[605][605],L[605],R[605];
    int get[605][605];
    int dfs(int l, int r){
       if(dp[l][r]!=0) return dp[l][r];
       if(l==r) return dp[l][r]=1;
       for(int k=L[l]; k<=R[l]; k+=2){
           int left=k/2;
           if( left + l + 1 > r ) break;
           if(dfs(l+1,l+left+1)==1&&dfs(l+left+1,r)==1){
              get[l][r]=left;
              return dp[l][r]=1;
           }
       }
      return dp[l][r]=2;
    }
    void print(int l, int r){
       if(l==r) return ;
       printf("(");
        print(l+1,l+get[l][r]+1);
        printf(")");
        print(l+get[l][r]+1,r);
    }
    int main()
    {
        int n;
        while(scanf("%d",&n)==1){
             memset(dp,0,sizeof(dp));
             for(int i=0; i<n; ++i){
                 scanf("%d%d",&L[i],&R[i]);
                 if(L[i]%2==0) L[i]++;
             }
             if(dfs(0,n)==1){print(0,n); printf("
    ");}
             else puts("IMPOSSIBLE");
    
        }
        return 0;
    }
    #include <iostream>
    #include <cstdio>
    #include<algorithm>
    #include <string.h>
    using namespace std;
    int dp[605][605],L[605],R[605];
    int get[605][605];
    int dfs(int l, int r){
       if(dp[l][r]!=0) return dp[l][r];
       if(l==r) return dp[l][r]=1;
       for(int k=L[l]; k<=R[l]; k+=2){
           int left=k/2;
           if( left + l + 1 > r ) break;
           if(dfs(l+1,l+left+1)==1&&dfs(l+left+1,r)==1){
              get[l][r]=left;
              return dp[l][r]=1;
           }
       }
      return dp[l][r]=2;
    }
    void print(int l, int r){
       if(l==r) return ;
       printf("(");
        print(l+1,l+get[l][r]+1);
        printf(")");
        print(l+get[l][r]+1,r);
    }
    int main()
    {
        int n;
        while(scanf("%d",&n)==1){
             memset(dp,0,sizeof(dp));
             for(int i=0; i<n; ++i){
                 scanf("%d%d",&L[i],&R[i]);
                 if(L[i]%2==0) L[i]++;
             }
             if(dfs(0,n)==1){print(0,n); printf("
    ");}
             else puts("IMPOSSIBLE");
    
        }
        return 0;
    }
  • 相关阅读:
    洛谷 P1767 家族_NOI导刊2010普及(10)
    洛谷 P2919 [USACO08NOV]守护农场Guarding the Farm
    COGS 1619. [HEOI2012]采花
    UVA 11181 Probability|Given
    hdu 3336 Count the string
    洛谷 P2176 [USACO14FEB]路障Roadblock
    洛谷 P2691 逃离
    BZOJ 1040: [ZJOI2008]骑士
    vijos 1320 清点人数
    POJ 3417 Network
  • 原文地址:https://www.cnblogs.com/Opaser/p/4265731.html
Copyright © 2011-2022 走看看