POJ 2955 区间dp
来源:互联网 发布:英文版导航软件 编辑:程序博客网 时间:2024/04/29 18:40
题意:求括号匹配的最大长度
思路:简单区间dp,令dp[i][j] 为 区间(i,j)之间的最大匹配长度。
这样dp[i][j] = max( dp[i][j] , dp[i][x] + dp[x+1][j] ) i<x<j
不过dp[i][j] 得先初始化,为dp[i+1][j-1] 或者 dp[i+1][j-1] +2 ;
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;int const maxn = 110;char str[maxn];int dp[maxn][maxn];int main(){ while(scanf("%s",str)!=EOF) { if(str[0]=='e')break; int n = strlen(str); memset(dp,0,sizeof(dp)); for(int i = 0 ; i < n ; i++) {//初始化 dp[i][i] = 0 ; if((str[i]=='('&&str[i+1]==')')||(str[i]=='['&&str[i+1]==']')) dp[i][i+1] = 2 ; else dp[i][i+1] = 0 ; } for(int k = 2 ; k < n ; k++) { for(int i = 0 , j = k ; j < n ; j++ , i++) { //每次i和j相隔k个距离 if((str[i]=='('&&str[j]==')')||(str[i]=='['&&str[j]==']')) //匹配 dp[i][j] = dp[i+1][j-1] + 2 ; for(int x = i ; x < j ; x++) //区间最值合并 { dp[i][j] = max(dp[i][j],dp[i][x] + dp[x+1][j]); } } } printf("%d\n",dp[0][n-1]); } return 0;}/*Auther:LIUYAN2015.12.16((()))()()()([]]))[)(([][][)end*/
0 0
- poj 2955 区间DP
- poj 2955(区间DP)
- POJ 2955 区间dp
- POJ 2955 区间DP
- POJ 2955 区间DP
- poj 2955 区间dp
- poj 2955 区间dp
- POJ 2955(区间DP)
- poj 2955【区间dp】
- POJ 2955 区间dp
- POJ-2955(区间DP)
- poj 2955 Brackets(区间DP)
- poj 2955 Brackets 【区间DP】
- POJ 2955(区间dp)
- POJ 2955 Brackets(区间DP)
- poj-2955 Brackets 区间dp
- POJ 2955 Brackets (区间dp)
- POJ 2955 Brackets 区间DP
- [easyUI] textbox的disabled属性和disable方法
- pp看书笔记---C#高级编程第九版 第六章 【数组】
- Linux负载均衡环境搭建-2 安装J2EE环境
- 内核启动信息中NET: Registered protocol family 31
- apache bench
- POJ 2955 区间dp
- POJ 3422:Kaka's Matrix Travels
- mininet中无法使用xterm
- 面试题21:旋转字符串(艺术)
- NSPopover使用
- iOS每日一记之------常用小工具代码合集
- Android开发之如何使用Intent传递对象
- Java获得硬盘和主板的序列号代码
- java普通接口编写