poj 2955(Brackets)【 区间dp2】
来源:互联网 发布:征途重置版网络不稳定 编辑:程序博客网 时间:2024/06/13 05:09
由于最近练习所以将区间DP的专题拿出来作,感谢博主的推荐:
专题地址:点击打开链接
题目链接:点击打开链接
题目大意:求配对的括号的最大数目
题目分析:和之前的几题一样先进行预处理,最重要的是枚举长度,在移动分界点从而进行dp
dp[i][i+k]=max(dp[i][i+k],dp[i][j]+dp[j+1][i+k]);
代码如下,欢迎斧正
#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#include<cmath>using namespace std;char s[110];int dp[110][110];bool f[110][110];int len;bool match(int a,int b){ if(s[a]=='('&& s[b]==')') return true; if (s[a]=='['&&s[b]==']') return true; return false;}void solve(){ len=strlen(s); int i,j,k; for(i=0;i<len;i++) { if(match(i,i+1)) { dp[i][i+1]=2; if(match(i+2,i+3)) dp[i][i+3]=4; } if((match(i+1,i+2))&&(match(i,i+3))) { dp[i][i+3]=4; } } for (k=2;k<len;k++) { for(i=0;i+k<len;i++) { if(match(i,i+k)) dp[i][i+k]=dp[i+1][i+k-1]+2; for(j=i;j<i+k;j++) dp[i][i+k]=max(dp[i][i+k],dp[i][j]+dp[j+1][i+k]); } }}int main(){ while(1) { scanf("%s",s); if(s[0]=='e') break; memset(f,false,sizeof(f)); memset(dp,0,sizeof(dp)); solve(); printf("%d\n",dp[0][len-1]); } return 0;}
- poj 2955(Brackets)【 区间dp2】
- POJ 2955 Brackets (区间DP2)
- Brackets(poj-2955)(区间dp)
- POJ 2955-Brackets(区间DP)
- poj 2955 Brackets(区间DP)
- POJ 题目2955 Brackets(区间dp)
- poj 2955 Brackets(区间dp)
- POJ 2955 Brackets (区间DP)
- poj 2955 Brackets(区间dp)
- poj 2955 Brackets (区间dp)
- POJ - 2955 Brackets(区间dp)
- POJ 2955 Brackets(区间DP水题)
- POJ 2955 Brackets(区间DP)
- poj--2955--Brackets(区间dp)
- POJ 2955Brackets(区间DP)
- POJ 2955Brackets(区间DP)
- poj 2955 Brackets (区间DP)
- 【POJ 2955】Brackets(区间DP)
- GenyMotion使用遇到的问题杂记(更新中)
- linux输入子系统分析
- JSTL标签库学习笔记 七、SQL标签库
- 青铜器RDM作为科研创新管理的领导者,服务众多行业第一名客户
- c/c++编译器的内存分配模式
- poj 2955(Brackets)【 区间dp2】
- 洗牌算法
- 数据结构练习题——合并表
- 编程珠玑-第2章课后习题8:如何快速确定一个集合中其元素之和不超过某值【未完成】
- javascript模块化是什么及其优缺点介绍
- Android中Bundle类的作用
- C结构体之位域(位段)
- 常用的主机监控Shell脚本
- MyEclipse修改JSP页面模板