NYOJ15-括号匹配(二)-区间DP

http://acm.nyist.net/JudgeOnline/problem.php?

pid=15

dp[i][j]表示从i到j至少须要加入多少个括号才干满足匹配条件.

初始化:

if(i == j)

dp[i][j] = 1;

else

dp[i][j] = INF;

状态转移:

当i < j时;

if(match(str[i], str[j])) dp[i][j] = min(dp[i][j], d[i + 1][j - 1]);

然后切割区间, 找最优切割点k. (i <= k <= j);

dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);

循环时, 遍历区间(i...j)的起点i以及区间长度len, len从小到大依次递增.

即循环找出每一段起点为i长度为len的区间的最优解, 慢慢扩大至整个区间.即终于问题的解!

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <iomanip>
#define CL(x,v); memset(x,v,sizeof(x));
#define INF 1<<29
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

const int N = 100 + 10;
int dp[N][N];
char str[N];

int match(char ch1, char ch2)
{
    if((ch1 == ‘(‘ && ch2 == ‘)‘) || (ch1 == ‘[‘ && ch2== ‘]‘))
        return 1;
    return 0;
}

int main()
{
	int t;
	scanf("%d", &t);
	while(t--)
    {
        CL(dp, 0);
        scanf("%s", str);
        int length = strlen(str);

        for(int i = 0; i < length; ++i)
            dp[i][i] = 1;
        for(int len = 1; len < length; ++len)
        {
            for(int i = 0; i < length - len; ++i)
            {
                int j = i + len;
                dp[i][j] = INF;

                if(match(str[i], str[j]))
                   dp[i][j] = min(dp[i][j], dp[i + 1][j - 1]);

                for(int k = i; k <= j; ++k)
                    dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
            }
        }
        cout << dp[0][length - 1] << endl;
    }
    return 0;
}
时间: 2024-10-26 23:14:55

NYOJ15-括号匹配(二)-区间DP的相关文章

括号匹配问题 区间DP经典问题

题目链接 http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=15 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 分析:要求要添加多少个,可以求出最大匹配的长度,这样剩下的都是没有匹配的,所以每个对于一个匹配就可以了. 即 答案 =

poj2955:括号匹配,区间dp

题目大意: 给一个由,(,),[,]组成的字符串,其中(),[]可以匹配,求最大匹配数 题解:区间dp: dp[i][j]表示区间 [i,j]中的最大匹配数 初始状态 dp[i][i+1]=(i,i+1可以匹配)?2:0 状态转移见代码 代码: #include <iostream> #include <stdio.h> #include<string.h> #include<algorithm> #include<string> #includ

NYOJ15括号匹配

NYOJ15括号匹配 括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说

「kuangbin带你飞」专题二十二 区间DP

layout: post title: 「kuangbin带你飞」专题二十二 区间DP author: "luowentaoaa" catalog: true tags: - kuangbin - 区间DP - 动态规划 传送门 B.LightOJ - 1422 Halloween Costumes 题意 按顺序参加舞会,参加一个舞会要穿一种衣服,可以在参加完一个舞会后套上另一个衣服再去参加舞会,也可以在参加一个舞会的时候把外面的衣服脱了,脱到合适的衣服,但是脱掉的衣服不能再穿,参加完

NYOJ15|括号匹配(二)|区间DP|Elena

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来. 如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度

【栈思想、DP】NYOJ-15 括号匹配(二)

括号匹配(二) 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100 输出 对于每组测试数据都输出一个正整数,表示最少需要添加的括

NYOJ15 括号匹配(二)

经典的动态规划题 这道题感觉确实有一定难度,感觉自己的dp学的弱爆了!以后还要努力啊! 括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<

imooc数据结构探险-栈篇 栈应用括号匹配二 由群友启发改良james_yuan老师算法

如图所示 引用群友内容 //老师代码有点麻烦了,不用声明两个mystack的,直接判断是否是左括号, //是的话就在mystack中push另一半括号:如果是右括号且又不是需要的括号, //就直接打印不匹配,如果是需要的右括号,就pop掉左括号.最后看mystack中栈顶是否为0,为0则打印括号匹配 /* 老师最后一点其实错了,default 其实没有必要写,只要把pNeedStack->pop(currentNeed)改为 if(!pNeedStack->pop(currentNeed))

NYOJ 15 括号匹配(二) dp

题目连接:check here~ 题意是说给一个字符串,包含'(',')','[',']'四种字符,判断至少需要添加几个字符使所给字符串括号匹配. 区间型动态规划,设dp[i][j]表示在字符串s中i位置到j位置所需要添加的最少的字符(i <= j) 有两种情况: 1.dp[i][j] = dp[i+1][j] + 1; 表示:在i到j之间没有与s[i]相匹配的括号,则必须添加一个字符来与之匹配,问题就转化为:从i+1位置到j位置所需要添加的最少的字符+1. 2.dp[i][j] = min{