标签:
6 (())() 3 ))(
6 1 0 1
这道题开始我想简单了,结果一开始提交错误。后来采用动态规划的办法,代码如下
1 #include <iostream> 2 #include <cstring> 3 #include <stdio.h> 4 #include <stdlib.h> 5 using namespace std; 6 7 char str[1000002]; 8 int cnt[1000002]; 9 int n; 10 int main(int argc,char* argv[]) 11 { 12 while(scanf("%d %s",&n,str)!= EOF) { 13 14 int temp = 0; 15 int len = strlen(str); 16 memset(cnt, 0, sizeof(cnt)); 17 for(int i = 0; i < len; i++) { 18 if(str[i] == ‘(‘) { 19 temp++; 20 } 21 else if(str[i] == ‘)‘) { 22 temp--; 23 if(temp < 0) { 24 temp = 0; 25 } 26 else { 27 if(i-1 == 0) { 28 cnt[i] = 2; 29 } 30 else { 31 if(str[i-1] == ‘(‘) { 32 cnt[i] = cnt[i-2] + 2; 33 } 34 else if(str[i-1] == ‘)‘) { 35 cnt[i] = cnt[i-1] + 2; 36 if(i - cnt[i] >= 0) { 37 cnt[i] = cnt[i-cnt[i]] + cnt[i]; 38 } 39 } 40 } 41 } 42 43 44 } 45 } 46 int maxCnt = 0; 47 int maxHap = 0; 48 49 for(int i = 0; i < len; i++) { 50 if(maxCnt < cnt[i]) { 51 maxCnt = cnt[i]; 52 maxHap = 1; 53 } 54 else if(maxCnt == cnt[i]) { 55 maxHap++; 56 } 57 } 58 if(maxCnt != 0) { 59 printf("%d %d\n",maxCnt, maxHap); 60 } 61 else { 62 printf("%d %d\n",0, 1); 63 } 64 65 } 66 return 0; 67 }
其中,cnt[i]表示第i个位置的合法序列长度为多长
标签:
原文地址:http://www.cnblogs.com/jasonJie/p/5774237.html