博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
例题9-10 UVa1626&&POJ1141 Brackets Sequence(DP)
阅读量:7049 次
发布时间:2019-06-28

本文共 1354 字,大约阅读时间需要 4 分钟。

题意:

看白书

要点:

状态转移方程真难想,这基本上是个区间DP问题,但还得考虑首尾已经是正规的,这两种情况都要考虑,而且还互相干扰,最后还得打印解,基本就是重新检查一下哪个决策最好。还有个陷阱:输入串可能是空串,所以要用gets。

15546092 Accepted 4024K 32MS 1166B 2016-05-24 14:57:43
#include
#include
#include
#include
using namespace std;char str[1000];int d[1000][1000];int n;bool match(char a, char b){ if ((a == '('&&b == ')')||(a == '['&&b == ']')) return true; return false;}void dp(){ int i, j, k, l; memset(d, 0, sizeof(d)); for (i = 0; i <= n; i++) d[i][i] = 1; //单字符为0 for (l = 2; l <= n; l++) { for (i = 0; i + l <= n; i++) { j = i + l-1; d[i][j] = 0x3f3f3f3f; if (match(str[i],str[j])) d[i][j] = min(d[i][j],d[i + 1][j - 1]); for (k = i; k <= j-1; k++) d[i][j] = min(d[i][j], d[i][k] + d[k+1][j]); } }}void print(int i, int j){ if (i > j) return; if (i == j) { if (str[i] == '(' || str[i] == ')') printf("()"); else printf("[]"); return; } int ans = d[i][j]; if (match(str[i], str[j]) && (ans == d[i + 1][j - 1])) { printf("%c", str[i]); print(i + 1, j - 1); printf("%c", str[j]); return; } for (int k = i; k <= j - 1; k++) { if (ans == d[i][k] + d[k + 1][j]) { print(i, k); print(k + 1, j); return; } }}int main(){ gets_s(str); n = strlen(str); dp(); print(0, n-1); printf("\n"); return 0;}

转载于:https://www.cnblogs.com/seasonal/p/10343734.html

你可能感兴趣的文章
sql server 2000,一个数据库最多能建多少张表,每张表最多能建多少个字段?
查看>>
系统表相关SQL语句
查看>>
MWC 2017:S8缺席,三星祭出AR/VR项目救场
查看>>
iOS 官方文档阅读顺序整理
查看>>
获取验证码的URL后边为什么要加上一个值不断变化的参数?
查看>>
centos7 mysql的安装
查看>>
Javascript跨浏览器的事件对象
查看>>
前端代码规范
查看>>
UITableView:下拉刷新和上拉加载更多
查看>>
CFileDialog
查看>>
centOS Python 安装2.7以上版本
查看>>
最近気になる清掃
查看>>
C语言下的简易计算器
查看>>
git 分支
查看>>
一类分治问题
查看>>
[ZJOI2017]树状数组
查看>>
Android SDK无法更新问题解决
查看>>
LeetCode – Refresh – N-Queens II
查看>>
LeetCode 639: DecodeWaysII
查看>>
Linux系统简介--LInix系统随笔(一)
查看>>