您的位置:首页 > 其它

近期总结_xdu 11月赛

2011-12-10 10:29 281 查看
又见括号匹配

 赛后想到一个3维dp,f[i][j][k]表示第i个位置匹配j个')',剩余k个未匹配,为了保证匹配方式合法,即在任意位置往前看右括号数必须大于等于左括号数,"()((..."为合法"())((..."就不合法。0

 举了1个简单的例子 n=8时 " ( 1 ( 2 ( 3 ()" 即求将3个右括号合法地插入1,2,3,这3个位置的方案数。初始化f[3][j][k]=1;

f[2][j][k]=sum(f[3][r][k-r]) 0<=r<=t; t=3-j-r && k-r>=0 这都是为了使括号的插入合法化(k-r>=0貌似不需要哈- -');

然后就是字符串匹配了.ans[i]表示第i个位置匹配的左括号数,第n/2个位置的匹配数为n/2-前面所有的匹配数。

View Code

1 #include<stdio.h>
2 #include<string.h>
3
4 char g_m[13][32];
5 char g_q[32][13];
6
7 int input()
8 {
9     int i,j,m,d;
10     for(i=0;i<33;i++)
11     for(j=0;j<33;j++)
12     g_q[i][j]=g_m[i][j]='0';
13     for(i=0;i<10;i++)
14     {
15         if(scanf("%d.%d",&m,&d)==EOF)return 0;
16         g_m[m][d]=1+'0';
17         g_q[d][m]=1+'0';
18     }
19     return 1;
20 }
21 void work()
22 {
23     int i,j,k,count,tmp;
24     char tmp_q[32][13],tmp_m[13][32];
25 //wa点1:要用一个tmp来临时存放g
26     memcpy(tmp_q,g_q,sizeof(g_q));
27     memcpy(tmp_m,g_m,sizeof(g_m));
28     for(i=1;i<=31;i++)
29     {
30         for(j=1,count=0;j<=12;j++)
31             if(tmp_q[i][j]!='0'){count++;tmp=j;}
32         if(count==1)
33         {
34             for(k=1;k<=31;k++)
35             {
36                 g_q[k][tmp]='0';
37                 g_m[tmp][k]='0';
38             }
39         }
40     }
41     memcpy(tmp_q,g_q,sizeof(g_q));
42     memcpy(tmp_m,g_m,sizeof(g_m));
43     for(i=1;i<=31;i++)
44     {
45         for(j=1,count=0;j<=12;j++)
46             if(tmp_q[i][j]!='0')count++;
47         if(count>1)
48         {
49             for(k=1;k<=12;k++)
50             {
51                 g_m[k][i]='0';
52                 g_q[i][k]='0';
53             }
54         }
55     }
56     memcpy(tmp_q,g_q,sizeof(g_q));
57     memcpy(tmp_m,g_m,sizeof(g_m));
58     for(i=1;i<=12;i++)
59     {
60         for(j=1,count=0;j<=31;j++)
61             if(tmp_m[i][j]!='0')count++;
62         if(count>1)
63         {
64             for(k=1;k<=31;k++)
65             {
66                 g_m[i][k]='0';
67                 g_q[k][i]='0';
68             }
69         }
70     }
71     for(i=1;i<=12;i++)
72     for(j=1;j<=31;j++)
73     if(g_m[i][j]!='0')
74     {
75         printf("%d.%d\n",i,j);
76         return;
77     }
78 }
79 int main()
80 {
81     freopen("ph.txt","r",stdin);
82     while(input())
83     {
84         work();
85     }
86     return 0;
87 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: