poj1141
来源:互联网 发布:网络侵权责任纠纷 编辑:程序博客网 时间:2024/06/05 19:05
dp
dp[i][j]表示串从i到j需要添加的括号数,显然,如果字符串长度为一,dp[i][i]=1;当大于一的时候:
如果str[i]与str[j]匹配,则dp[i][j]=dp[i+1][j-1];否则dp[i][j]=min(dp[i][k]+dp[k+1][j]) (i<=k<j)
用path[i][j]记录k的位置,递归输出括号。
具体见代码:
#include<iostream>#include<cstdio>#include<cstring>#define MAX 111using namespace std;char ch[MAX];int dp[MAX][MAX],path[MAX][MAX];void out(int l,int r){ if(l>r) return ; if(l==r) { if(ch[l]=='('||ch[l]==')') printf("()"); else printf("[]"); } else if(path[l][r]==-1) { printf("%c",ch[l]); out(l+1,r-1); printf("%c",ch[r]); } else { out(l,path[l][r]); out(path[l][r]+1,r); }}int main(){ int i,j; int len,temp; cin>>ch; len=strlen(ch); for(i=0;i<MAX;i++) dp[i][i]=1; int t; for(t=1;t<len;t++) //枚举子串的长度,由1至len; { for(i=0;i<len-t;i++) //i为串的首指针,j为尾指针; { j=i+t; dp[i][j]=111111111; if(ch[i]=='('&&ch[j]==')'||ch[i]=='['&&ch[j]==']') { dp[i][j]=dp[i+1][j-1]; path[i][j]=-1; } for(int k=i;k<j;k++) { if(dp[i][j]>dp[i][k]+dp[k+1][j]) { dp[i][j]=dp[i][k]+dp[k+1][j]; path[i][j]=k; } } } } out(0,len-1); cout<<endl; return 0;}
0 0
- poj1141
- poj1141
- poj1141
- poj1141
- poj1141
- poj1141
- poj1141
- poj1141
- poj1141
- POJ1141 dp
- poj1141 dp
- poj1141 dp
- POJ1141 Brackets Sequence
- poj1141 括号序列 dp
- poj1141 Brackets Sequence
- POJ1141 动态规划
- poj1141 动态规划
- poj1141 动态规划
- Reflector反编译软件激活和使用
- uva 10285 Longest Run on a Snowboard
- 数据挖掘考试重点(条理版)
- override作为c++保留字的用发
- 算法(时间复杂度为O(nlgk)的k有序链(从小到大)表合并为一个有序链表
- poj1141
- Easyui开发部门管理模块_部分模块code.jsp
- CareerCup chapter 3 Stacks and Queues
- POJ2368 Buttons
- 【翻译】Ext JS 4——Ajax和Rest代理处理服务器端一场和消息的方法
- [notes] ImageNet Classification with Deep Convolutional Neual Network
- WM_NCHITTEST消息
- Nmap Cheat Sheet: From Discovery to Exploits – Part 1: Introduction to Nmap
- 条款13:以对象管理资源