nyoj 括号匹配

这个方程有两种形式,本文采用

if(s[i]=s[j]) dp[i][j]=d[i-1][j-1]

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

其实与另一种方法比较:根据j的所有匹配情况取最小值

1.i到j无匹配,取为dp[i][j-1]+1

2.列举所有匹配情况 dp[i][k-1]+dp[k+1][j]

取上述所有情况最小值

两者都能获得正确的结果。

同时两者的初始化为 dp[i][j]==1 if(i==j)

规划方向为:








   
   

(1) (2)  (3) (4)填写顺序
































1 (1) (3) (6) (10)
  1 (2) (5) (9)
    1 (4) (8)
      1 (7)
        1
// ConsoleApplication8.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#include<string>
#include<memory.h>
using namespace std;
#define min(x,y) (x < y ? x : y)

bool isEqual(char c,char b)
{
if(c==‘(‘&&b==‘)‘) return true;
if(c==‘[‘&&b==‘]‘) return true;
return false;

}

int main()
{
int dp[102][102];

int len;
cin>>len;
while(len--)
{
string a;
cin>>a;
int len=a.length();
memset(dp,0,sizeof(dp));//clear
dp[0][0]=1;
for(int i=1;i<len;i++)
{
dp[i][i]=1;

for(int j=i-1;j>=0;j--)
{
dp[j][i]=100000;
if(isEqual(a[j],a[i]))
{
dp[j][i]= min(dp[j][i],dp[j+1][i-1]);
}
for(int k=j;k<i;k++)
{
dp[j][i]=min(dp[j][k]+dp[k+1][i],dp[j][i]);

}

}

}

cout<<dp[0][len-1]<<endl;

}

}


// ConsoleApplication8.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#include<string>
#include<memory.h>
using namespace std;
#define min(x,y) (x < y ? x : y)

bool isEqual(char c,char b)
{
if(c==‘(‘&&b==‘)‘) return true;
if(c==‘[‘&&b==‘]‘) return true;
return false;

}

int main()
{
int dp[102][102];

int len;
cin>>len;
while(len--)
{
string a;
cin>>a;
int len=a.length();
memset(dp,0,sizeof(dp));//clear
// cout<<dp[45][56]<<endl;
dp[0][0]=1;
dp[1][1]=1;
for(int i=2;i<=len;i++)
{
dp[i][i]=1;

for(int j=i-1;j>=1;j--)
{
dp[j][i]=dp[j][i-1]+1; //没有匹配的情况
for(int k=j;k<i;k++)
{
if(isEqual(a[k-1],a[i-1]))
{
dp[j][i]= min(dp[j][i],dp[j][k-1]+dp[k+1][i-1]);
}

}

}

}

cout<<dp[1][len]<<endl;

}

}

nyoj 括号匹配,布布扣,bubuko.com

时间: 2024-07-30 13:40:43

nyoj 括号匹配的相关文章

NYOJ 括号匹配系列2,5

本文出自:http://blog.csdn.net/svitter 括号匹配一:http://acm.nyist.net/JudgeOnline/problem.php?pid=2 括号匹配二:http://acm.nyist.net/JudgeOnline/problem.php?pid=15 之前被这个题目难住,现在看动态规划就顺便过来AC了它.结果发现当年被难住一点也不丢人.. 括号匹配一很简单,就是栈的应用,AC代码: //================================

NYOJ - 括号匹配(二)(经典dp)

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

nyoj 括号匹配(二) 【DP】

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

区间dp 括号匹配 nyoj 15

题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=15 括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来. 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的 输入 第一行输入

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{

nyoj 15 括号匹配(二)

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

区间DP——括号匹配

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

括号匹配问题(顺序栈实现)

本周老师作业留了两个.先上传一个吧.那个有时间我再传上来~ 本周的要求: 1.给出顺序栈的存储结构定义. 2.完成顺序栈的基本操作函数. 1)      初始化顺序栈 2)      实现入栈和出栈操作 3)      实现取栈顶元素和判空操作 括号匹配问题 3.编写主函数实现基本操作函数功能,并设置测试数据,测试合法和非法数据的输出结果. 4.程序调试运行并保存输出结果. 5.整理并提交实验作业. 1 #include <cstdio> 2 #include <cstring>

堆栈_括号匹配

class Solution { public: bool isValid(string s) { if(s.empty()) return false; stack<int> s1; int n=s.size(); for(int i=0;i<n;i++) { if(s[i]=='('||s[i]=='['||s[i]=='{') s1.push(s[i]); else if(s1.empty()) return false; else if((s[i]==')'&&s