zoukankan      html  css  js  c++  java
  • POJ 1068 Parencodings 模拟递归

    http://poj.org/problem?id=1068

    题意:P=每个右括号前面的左括号,W=每个右括号所在的括号包含的完整括号数,包括其本身。已知P,求W。

    模拟题,将原括号按照数据呈现出来,用数组记录。

    然后用递归求出W,递归的出口为右括号,当为左括号时,对s进行叠加,即所包含的括号数。为右括号时,记录下W,并返回一个s。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 using namespace std;
     5 int p[100],w[100];
     6 char a[100];
     7 int i,j;
     8 int f()
     9 {
    10     int s=1;
    11     while(1)
    12     {
    13         if(a[j]=='(')
    14         {
    15             j++;
    16             s+=f();
    17         }
    18         else
    19         {
    20             w[i++]=s;
    21             j++;
    22             return s;
    23         }
    24     }
    25 }
    26 main()
    27 {
    28     int n,N,k,q;
    29     scanf("%d",&N);
    30     while(N--)
    31     {
    32         scanf("%d",&n);
    33         for(q=0,k=0,i=0;i<n;i++)
    34         {
    35             scanf("%d",&p[i]);
    36             for(j=0;j<p[i]-k;j++)
    37             {
    38                 a[q]='(';
    39                 q++;
    40             }
    41             k=p[i];
    42             a[q++]=')';
    43         }
    44         i=0;j=0;
    45         f();
    46         for(i=0;i<n;i++)
    47         {
    48             printf("%d ",w[i]);
    49         }
    50         printf("
    ");
    51     }
    52 }
    View Code

    第二种:

    根据 p 算出 每两个 右括号之间 有多少个 左括号,用 lp数组记录,然后 对每一个 右括号,往前搜索左括号

    比如 p 4 5 6 6 6 6 ,那么 lp 值为 4 1 1 0 0 0

    从第一个 右括号开始找,第一个对应 lp 第一个,发现lp不为 0 ,即将 lp-1,算出相应前面有多少个 右括号即可,若lp为 0 继续往前扫。。

     1 #include<cstdio>
     2 #include<cstring>
     3 
     4 #define for if(0);else for
     5 
     6 int p[25]={0};
     7 int lp[25];
     8 
     9 int main(){
    10     int t;
    11     scanf("%d",&t);
    12     while(t--){
    13         int n;
    14         scanf("%d",&n);
    15         for(int i=1;i<=n;i++){
    16             scanf("%d",&p[i]);
    17         }
    18         for(int i=1;i<=n;i++){
    19             lp[i]=p[i]-p[i-1];
    20         }
    21         for(int i=1;i<=n;i++){
    22             int j=i;
    23             while(!lp[j]&&j>1){
    24                 j--;
    25             }
    26             lp[j]--;
    27             printf("%d%c",i-j+1,i==n?'
    ':' ');
    28         }
    29     }
    30     return 0;
    31 }
    View Code
  • 相关阅读:
    flask框架-wtforms
    flask框架-蓝图
    flask框架-请求扩展
    flask框架-中间件
    flask框架-闪现
    flask框架-session
    flask框架-请求和响应
    flask框架-模板语言
    flask框架-路由
    flask框架-配置文件
  • 原文地址:https://www.cnblogs.com/CrazyBaby/p/5685228.html
Copyright © 2011-2022 走看看