POJ 2955 Brackets

来源:互联网 发布:朴素贝叶斯算法python 编辑:程序博客网 时间:2024/05/17 04:30

题目大意:

        给定“括号表达式“的归纳定义:

        1. 空序列是一个括号表达式;

        2. 如果s是一个括号表达式则(s)和[s]也是括号表达式;

        3. 如果a、b都是括号表达式则ab也是括号表达式;

        4. 其余的都不是括号表达式;

        现有多个测例(以单词end表示结尾),每个测例中都给定一个只含括号(、)、[、]的序列,每个序列占一行,对于每个测例都求出序列中最长括号表达式的长度,即最大括号匹配数量,比如()的括号匹配数为2,而(]的匹配数为0,其中序列长度为[1, 100]。

题目链接

注释代码:

/*                                          * Problem ID : POJ 2955 Brackets * Author     : Lirx.t.Una                                          * Language   : C++                         * Run Time   : 47 ms                                          * Run Memory : 132 KB                                         */   #include <string.h>#include <stdio.h>#defineTRUE1#defineFALSE0//maximum brackets length//括号序列的最大长度//最后一位留给'\0'#defineMAXBRKTN101#defineMAX(x,y)( (x) > (y) ? (x) : (y) )typedefintBOOL;charbrkt[MAXBRKTN];//bracket,括号序列//dp[i][j]表示括号序列中下标为i到下标为j之间括号的  //最大匹配数chardp[MAXBRKTN][MAXBRKTN];BOOLmatch( char a, char b ) {//检查两个括号是否匹配    //第一个必为左括号,第二个必为右括号if ( '(' == a && ')' == b )return TRUE;if ( '[' == a && ']' == b )return TRUE;return FALSE;}intmain() {intn;//括号个数inti, j, k;//计数变量intg;//gap,表示括号匹配的间隔while ( scanf("%s", brkt), *brkt != 'e' ) {n = strlen(brkt);for ( i = 0; i < n; i++ ) {//初始化dp[i][i] = 0;//自己到自己没有括号匹配            //初始化所有间隔为1的括号匹配情况if ( match( brkt[i], brkt[i + 1] ) )dp[i][i + 1] = 2;elsedp[i][i + 1] = 0;}        //转移方程为:        //dp[i][j] = MAX( dp[i + 1][j - 1] + 2(i、j必须匹配), MAX( dp[i][k] + dp[k + 1][j] )(1 ≤ k < j))for ( g = 2; g < n; g++ )//间隔从2开始递增到n - 1for ( i = 0, j = i + g; j < n; i++, j++ ) {                //逐个扫描间隔为g的区间[i, j]的匹配情况dp[i][j] = 0;//先初始化为0if ( match( brkt[i], brkt[j] ) )//先检查特殊情况,即区间两个端点是否匹配dp[i][j] = dp[i + 1][j - 1] + 2;for ( k = i; k < j; k++ )//再在区间中[i, j - 1]上逐个设断点                    //dp[i][j]必定是断点两边区间最大括号匹配数相加的值                    //当然要从上述特殊情况以及所有断点分割情况中选出最大的最为dp[i][j]的最终值dp[i][j] = MAX( dp[i][j], dp[i][k] + dp[k + 1][j] );}printf("%d\n", dp[0][n - 1]);}return 0;}

无注释代码:

#include <string.h>#include <stdio.h>#defineTRUE1#defineFALSE0#defineMAXBRKTN101#defineMAX(x,y)( (x) > (y) ? (x) : (y) )typedefintBOOL;charbrkt[MAXBRKTN];chardp[MAXBRKTN][MAXBRKTN];BOOLmatch( char a, char b ) {if ( '(' == a && ')' == b )return TRUE;if ( '[' == a && ']' == b )return TRUE;return FALSE;}intmain() {intn;inti, j, k;intg;while ( scanf("%s", brkt), *brkt != 'e' ) {n = strlen(brkt);for ( i = 0; i < n; i++ ) {dp[i][i] = 0;if ( match( brkt[i], brkt[i + 1] ) )dp[i][i + 1] = 2;elsedp[i][i + 1] = 0;}for ( g = 2; g < n; g++ )for ( i = 0, j = i + g; j < n; i++, j++ ) {dp[i][j] = 0;if ( match( brkt[i], brkt[j] ) )dp[i][j] = dp[i + 1][j - 1] + 2;for ( k = i; k < j; k++ )dp[i][j] = MAX( dp[i][j], dp[i][k] + dp[k + 1][j] );}printf("%d\n", dp[0][n - 1]);}return 0;}

单词解释:

regular:adj, 正规的,正则的,整齐的

inductive:adj, 归纳的

indice:n, 索引,标记体

0 0
原创粉丝点击