Hướng dẫn giải của Dãy ngoặc


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

var n,kk:longint;
    a:array[0..61] of longint;
    b:array[0..1,0..61,-1..31] of qword;
    c:array[0..61,-1..31] of qword;
    res,re:qword;

procedure rf;
var i,t:longint; c:char;
begin
     readln(n,kk);
     t:=0;
     for i:=1 to n do
     begin
          read(c);
          if c='(' then inc(t) else dec(t);
          a[i]:=t;
     end;
end;

procedure calc(z:longint);
var i,j,t,k:longint;
begin
     b[z,0,0]:=1; k:=kk-z;
     if k<1 then exit;
     for i:=1 to n div 2 do
     begin
          for j:=0 to i do
          begin
               if j<k then t:=j else t:=k;
               b[z,i,t]:=b[z,i-1,t-1]+b[z,i-1,t+1];
          end;
     end;
     for i:=n div 2 + 1 to n do
     begin
          for j:=0 to n-i do
          begin
               if j<k then t:=j else t:=k;
               b[z,i,t]:=b[z,i-1,t-1]+b[z,i-1,t+1];
          end;
     end;
end;

procedure pr;
var i,j,k:longint; kt:boolean;
begin
     fillchar(b,sizeof(b),0);
     calc(1); calc(0);
     for i:=0 to n do
         for j:=0 to kk do
             c[i,j]:=b[0,i,j]-b[1,i,j];
     re:=c[n,0];
     k:=1; res:=0;
     kt:=false;
     for i:=n-2 downto 2 do
     begin
          j:=a[n-i];
          if j>k then
          begin
               if not kt then res:=res+c[i,k-1]
               else res:=res+b[0,i,k-1];
          end;
          if j=kk then kt:=true;
          k:=j;
     end;
end;

procedure wf;
begin
     writeln(re);
     writeln(re-res);
end;

begin
     rf;
     pr;
     wf;
end.

Code mẫu của happyboy99x

#include<cstdio>

const int N = 60 + 2;
long long f[N][N/2][2];
int n, k;
char s[N];

void dp() {
    f[n][0][0] = 1;
    for(int x = n; x > 0; --x)
        for(int y = k; y >= 0; --y)
            for(int c = 0; c <= 1; ++c) {
                if(y > 0) f[x-1][y-1][c] += f[x][y][c];
                if(y < k) f[x-1][y+1][(y+1==k)|c] += f[x][y][c];
            }
}

long long order(char * s) {
    long long res = 1;
    int preH = 0, h = 0;
    bool c = false;
    for(int i = 0; i < n; ++i) {
        h += s[i] == '(' ? 1 : -1;
        if(h < preH && h + 2 <= k) {
            res += f[i+1][h+2][1];
            if(c) res += f[i+1][h+2][0];
        }
        c |= h == k; preH = h;
    }
    return res;
}

int main() {
    scanf("%d%d%s", &n, &k, s);
    dp();
    printf("%lld\n%lld\n", f[0][0][1], order(s));
    return 0;
}

Code mẫu của ladpro98

#include <bits/stdc++.h>
const int N = 66;
using namespace std;
string s;
long long F[N][N][N], G[N][N][2][N];
int n, d;

int main() {
    ios :: sync_with_stdio(0); cin.tie(0);
    cin >> n >> d; cin >> s;
    G[n][0][0][0] = 1;
    for(int i = n; i; i--)
    for(int j = 0; j <= d; j++)
    for(int k = 0; k <= d; k++)
    if (G[i][j][0][k] || G[i][j][1][k]) {
        F[i][j][k] = G[i][j][0][k] + G[i][j][1][k];
        G[i - 1][j + 1][1][max(k, j + 1)] += F[i][j][k];
        if (j) G[i - 1][j - 1][0][k] += F[i][j][k];
    }
    cout << G[0][0][0][d] << endl;
    int deg = 0; long long res = 1; bool passed = false;
    for(int i = 0; i < n; i++) {
        if (s[i] == ')') {
            if (passed) res += accumulate(G[i][deg][0], G[i][deg][0] + d + 1, 0);
            else
                res += G[i][deg][0][d];
        }
        if (s[i] == '(') deg++; else deg--;
        if (deg == d) passed = true;
    }
    cout << res << endl;
    return 0;
}

Code mẫu của RR

const   fi='';
        fo='';
        maxn=61;
type    mang=array[0..maxn,-1..maxn] of int64;
var     f:text;
        n,k,i,j,l,t:longint;
        sl1,sl2:mang;
        s:string;
        res1,res2:int64;
procedure doc;
begin
  assign(f,fi);
  reset(f);
  readln(f,n,k);
  readln(f,s);
  close(f);
end;
function min(a,b:longint):longint;
begin
  if a<b then exit(a) else exit(b);
end;
procedure tinh(b:longint;var sl:mang);
var i,j:longint;
begin
  sl[0,0]:=1;
  for i:=1 to n do
    for j:=0 to b do
      sl[i,j]:=sl[i-1,j-1]+sl[i-1,j+1];
end;
procedure xuli1;
begin
  tinh(k,sl1);tinh(k-1,sl2);
  res1:=sl1[n,0]-sl2[n,0];
end;
procedure xuli2;
begin
  t:=0;
  for i:=1 to n do
    begin
      if s[i]='(' then inc(t) else dec(t);
      if s[i]=')' then res2:=res2+sl1[n-i,t+2];
    end;
  for i:=1 to n do
    begin
      if s[i]='(' then inc(t) else dec(t);
      if t=k then break;
      if s[i]=')' then res2:=res2-sl2[n-i,t+2];
    end;
end;
procedure ghi;
begin
  assign(f,fo);
  rewrite(f);
  writeln(f,res1);
  writeln(f,res2+1);
  close(f);
end;
begin
  doc;
  xuli1;
  xuli2;
  ghi;
end.

Code mẫu của hieult

#include <cstdio>
#include <cstring>
//#include <conio.h>
#include <iostream>

    long long n,k,a[62],m;
    long long f[62][62],g[62][62];
    char s[62];

using namespace std;

int main()
{
    //freopen("BRACKET.in","r",stdin);

    scanf("%lld %lld",&n,&k);
   // printf("%d %d\n",'(',')');
    scanf("%s",s);
    a[0] = 0;
    int t = 0;
    for(int i  = 0;i<n;i++)
    {
            t++;
            if(s[i]=='(') a[t] = a[t-1]+1;
            else if(s[i]=')') a[t] = a[t-1]-1;
    }
    memset(f,0,sizeof(f));memset(g,0,sizeof(g));
    f[n][0] = 1;
    g[n][0] = 1;
    for(int i = n-1;i>=0;i--)
    {
         f[i][0] = f[i+1][1];
         for(int j = 1;j<=k;j++)
             f[i][j] = f[i+1][j-1]+f[i+1][j+1];
         //printf("%d\n",f[i][0]);
    }
    for(int i = n-1;i>=0;i--)
    {
         g[i][0] = g[i+1][1];
         for(int j = 1;j<=k-1;j++)
             g[i][j] = g[i+1][j-1]+g[i+1][j+1];
        // printf("%d\n",g[i][0]);
    }
    printf("%lld\n",f[0][0]-g[0][0]);
    long long kq = 1,kq1=0;
    for( t=0;t<=n-1;t++)
    {
        if(a[t+1]<a[t] && a[t]<k)
            kq1 += f[t+1][a[t]+1]-g[t+1][a[t]+1];
        if(a[t]==k)
            break;
    }
    for( ;t<=n-1;t++)
        if(a[t+1]<a[t] && a[t]<k)
            kq1 += f[t+1][a[t]+1];
    //printf("%lld %lld %lld\n",f[0][0],g[0][0],kq);
    printf("%lld",kq1+1);
   // getch();

}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.