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;}


原创粉丝点击