南阳理工OJ 15 括号匹配

思路:动态规划,设dp[i][j]表示第i个字符到第j个字符所需要的最少匹配数,则:(1),如果从第i到j-1个字符中没有一个与第j个字符匹配,那么状态转移方程为 dp[i][j] = dp[i][j-1] + 1 (2),如果在第i到j-1字符中存在与第j个字符匹配的字符(记为k,且把所有满足条件的k组成的集合记为A)那么状态转移方程为 dp[i][j] = min(dp[i][j],dp[i][k-1] + dp[k+1][j-1]) (k属于集合A)。


#include<iostream>
#include<string>
#define MAXN 111
using namespace std;
int dp[MAXN][MAXN];
string str;
int main(){
    int t;
    cin >> t;
    while(t--){
        str.clear();
        cin >> str;
        for(int i = 0;i < str.size();i ++) dp[i][i] = 1;
        for(int i = 1;i < str.size();i ++){
            for(int j = i-1;j >= 0;j --){
                dp[j][i] = dp[j][i-1] + 1;
                for(int k = j;k < i;k ++){
                    if(str[k] - str[i] == -1 || str[k] - str[i] == -2)
                        dp[j][i] = min(dp[j][i], dp[j][k-1] + dp[k+1][i-1]);
                }
            }
        }
        cout << dp[0][str.size()-1] << endl;
    }
    return 0;
}



posted on 2014-04-30 18:38  ~Love()  阅读(153)  评论(0)    收藏  举报

导航