poj2955 Brackets 【区间dp】
2016-07-18 16:16
344 查看
链接:http://poj.org/problem?id=2955
题意:给你一串由“( )”“[ ]”组成的括号串,现在问你最多的括号匹配。
分析:枚举一个长度,看看这个区间内有多少能匹配的括号,用dp[i][j]表示,s[i]和s[j]能匹配时dp[i][j]=dp[i+1][j-1]+2,然后枚举区间内的点,两段区间合并就可以找到最大的匹配。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define Mn 110
#define Mm 2000005
#define mod 1000000007
#define CLR(a,b) memset((a),(b),sizeof((a)))
#define CLRS(a,b,Size) memset((a),(b),sizeof((a[0]))*(Size+1))
#define CPY(a,b) memcpy ((a), (b), sizeof((a)))
#pragma comment(linker, "/STACK:102400000,102400000")
#define ul u<<1
#define ur (u<<1)|1
using namespace std;
typedef long long ll;
int dp[Mn][Mn];
int main() {
char s[110];
while(1) {
scanf("%s",s);
if(s[0]=='e') break;
CLR(dp,0);
int len=strlen(s);
for(int k=1;k<len;k++) {
for(int i=0,j=k;j<len;j++,i++) {
if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']'))
dp[i][j]=dp[i+1][j-1]+2;
for(int p=i;p<j;p++) {
dp[i][j]=max(dp[i][p]+dp[p+1][j],dp[i][j]);
}
}
}
printf("%d\n",dp[0][len-1]);
}
return 0;
}
题意:给你一串由“( )”“[ ]”组成的括号串,现在问你最多的括号匹配。
分析:枚举一个长度,看看这个区间内有多少能匹配的括号,用dp[i][j]表示,s[i]和s[j]能匹配时dp[i][j]=dp[i+1][j-1]+2,然后枚举区间内的点,两段区间合并就可以找到最大的匹配。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define Mn 110
#define Mm 2000005
#define mod 1000000007
#define CLR(a,b) memset((a),(b),sizeof((a)))
#define CLRS(a,b,Size) memset((a),(b),sizeof((a[0]))*(Size+1))
#define CPY(a,b) memcpy ((a), (b), sizeof((a)))
#pragma comment(linker, "/STACK:102400000,102400000")
#define ul u<<1
#define ur (u<<1)|1
using namespace std;
typedef long long ll;
int dp[Mn][Mn];
int main() {
char s[110];
while(1) {
scanf("%s",s);
if(s[0]=='e') break;
CLR(dp,0);
int len=strlen(s);
for(int k=1;k<len;k++) {
for(int i=0,j=k;j<len;j++,i++) {
if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']'))
dp[i][j]=dp[i+1][j-1]+2;
for(int p=i;p<j;p++) {
dp[i][j]=max(dp[i][p]+dp[p+1][j],dp[i][j]);
}
}
}
printf("%d\n",dp[0][len-1]);
}
return 0;
}
相关文章推荐
- 15.析构函数
- C/C++ 静态链接库(.a) 与 动态链接库(.so)
- 每天一个linux命令(53)--ps命令
- 简单判断是否是微信打开页面代码
- ES
- Android发送验证码倒计时
- 多线程Java
- Mac OS X窗口最小化方法的几个快捷键
- Hibernate总结(一)--之hibernate配置文件
- java格式化时间到毫秒
- [poj 2001]Shortest Prefixes [Trie]
- cookie 和session 的区别详解
- 常用Linux命令
- 复制”链接文件“到虚拟机(VirtualBox)的”共享文件夹“时报错:创建符号链接时报错:只读文件系统
- 《UNIX环境高级编程第三版》apue.h等源码文件的编译安装
- nltk官方学习资料
- python正则表达式--基本用法和函数(理论知识)
- 学习笔记-斯坦福iOS7-第十一课:表格视图和iPad
- 8张图理解Java
- [kuangbin带我飞]数位DP F(x)