近期总结_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
赛后想到一个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 }