题意简述:如下规定:
1.空序列是规则序列;2.S是规则序列,则(S)和【S】也是规则序列;3.A,B是规则序列,则AB也是规则序列。
给出有(,),【,】构成的序列,编程求出是添加括号尽量少得到的规则序列。
分析:其实题意已经道出了状态和状态之间的关系,就设dp[i][j]保存从第i个字符到第j个字符构成的序列要达到规则序列所要添加的最少括号数。再设一个字符串类型的数组ans[i][j]来记录数组,其最终的最优值保存在dp[0][len-1]和ans[0][len-1]。
先根据第二个条件来进行状态转移:(由于这个转移不方便用方程来表示,简述一下)当最外面是()或【】那么dp[i][j]=min(dp[i][j],dp[i+1][j-1]);当一边的一个为‘(’那么dp[i][j]=min(dp[i][j],1+dp[i+1][j]);同理可推这类的其他情况。
再根据第三个条件来状态转移:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])。
这样就只要把边界处理好就求解出来了(边界代码中列出)