POJ 1141 (动态规划)
来源:互联网 发布:js读取本地文件到流 编辑:程序博客网 时间:2024/06/08 08:59
先看一种容易理解的方法,不过会超时
#include <stdio.h>#include <string>#include <string.h>using namespace std;char str[101];string lbr = "(";string rbr = ")";string lsbr = "[";string rsbr = "]";//char res[201];const int INF = 99999999;string dp(int i, int j, int& min){if (i == j){if (str[i]=='(' || str[i] == ')'){return lbr+rbr;}if (str[i]=='[' || str[i] == ']'){return lsbr+rsbr;}}int mn = 0;if (str[i] == '(' && str[j] == ')'){return lbr + dp(i+1, j-1, mn) + rbr;}if (str[i] == '[' && str[j] == ']'){return lsbr + dp(i+1, j-1, mn) + rsbr;}min = INF;string s;int k = 0;for (k = i; k < j; ++k){string st = dp(i, k, mn) + dp(k+1, j, mn);if (mn < min){min = mn;s = st;}}return s;}void solve(){int len = strlen(str);int min = 0;string res = dp(0, len-1, min);printf("%s\n", res.c_str());}int main(){gets(str);solve();return 0;}
再看动态规划方法:
//dp策略: dp[i][j] = dp[i][k] + dp[k+1][j];
特别的,如果 (s[i]=='(' && s[j]==')') 或者 (s[i]=='[' && s[j]==']')
则 dp[i][j] = dp[i+1][j-1];
#include <iostream>using namespace std;const int INF = 0x03F3F3F3F;const int MAX_LEN = 102;char s[MAX_LEN];int dp[MAX_LEN][MAX_LEN], path[MAX_LEN][MAX_LEN];int n;void output(int st, int ed){if (st == ed){if (s[st]=='[' || s[st]==']') printf("[]");else printf("()");}else if (st > ed){return;}else{if (path[st][ed] == -1){printf("%c",s[st]);output(st+1,ed-1);printf("%c",s[ed]);}else{output(st, path[st][ed]);output(path[st][ed]+1, ed);}}}int main(){scanf("%s", s);n = strlen(s);//dp策略: //dp[i][j] = dp[i][k] + dp[k+1][j];//特别的,如果 (s[i]=='(' && s[j]==')') 或者 (s[i]=='[' && s[j]==']')//则 dp[i][j] = dp[i+1][j-1];for (int i = n-1; i >= 0; --i){dp[i][i] = 1;for (int j = i+1; j < n; ++j){dp[i][j] = INF;if ((s[i]=='(' && s[j]==')') || (s[i]=='[' && s[j]==']')){if (j == i + 1) dp[i][j] = 0;else 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;}}}}output(0, n-1);printf("\n");return 0;}
- [poj] 动态规划 1141
- POJ 1141 (动态规划)
- 动态规划 :POJ 1141 括号匹配
- POJ 1141 Brackets Sequence 动态规划
- 动态规划 Brackets Sequence poj 1141
- 动态规划 Brackets Sequence poj 1141
- POJ 1141 Brackets Sequence 动态规划
- poj 1141(Brackets Sequence 动态规划)
- poj 2411 动态规划
- Poj 1157(动态规划)
- POJ 1651动态规划
- Poj 1221 动态规划
- POJ 3186 动态规划
- [poj]动态规划2479
- [poj]动态规划1015
- POJ 1088 动态规划
- poj 1636 动态规划
- poj 1159 动态规划
- VMware下LINUX的虚拟机增加磁盘空间
- 1025. PAT Ranking (25)
- 数字游戏 qsort
- Android NDK纯C++开发(2)
- 1026. Table Tennis (30)
- POJ 1141 (动态规划)
- s5pv210clock时钟体系
- gdb 使用
- C++学习笔记7——标准IO库
- 从1.5k到18k, 一个程序员的5年成长之路
- 【计算机网络】网络编程--udp发送接收数据
- sigaction函数及信号的处理方式
- TThread执行自定义函数
- 详解在Myeclipse中搭建ssh工程(一)