http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/E

题意:添加最少的括号,让每个括号都能匹配并输出

分析:dp[i][j]表示第i个到第j个需要添加的最少的括号,pos[i][j] = k;表示i到j间第k个需要加括号;

如果str[i]和str[j]匹配,那么dp[i][j] = max(dp[i + 1][j - 1], dp[i][j]);

如果str[i]和str[j]不匹配,那么dp[i][j] = max(dp[i][j], dp[i][k]+dp[k + 1][j]);     i<= k < j;之前想过k为什么不能等于j,

 #include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int MAX = ;
const int INF = 0x3f3f3f3f;
int dp[MAX][MAX],pos[MAX][MAX];
char str[MAX];
int n;
void DP()
{
n = strlen(str); memset(dp, , sizeof(dp));
for(int i = ; i < n; i++)
dp[i][i] = ;
for(int p = ; p < n; p++)
{
for(int i = ; i < n; i++)
{
int j = i + p;
if(j >= n)
break;
dp[i][j] = INF;
if( (str[i] == '(' && str[j] == ')') || ( str[i] == '[' && str[j] == ']' ) )
{
if(dp[i][j] > dp[i + ][j - ])
dp[i][j] = dp[i + ][j - ];
}
pos[i][j] = -;
for(int k = i; k < j; k++)
{
int temp = dp[i][k] + dp[k + ][j];
if(temp < dp[i][j])
{
dp[i][j] = temp;
pos[i][j] = k;
}
}
}
}
}
void Print(int beg, int End)
{
if(beg > End)
return;
if(beg == End)
{
if(str[beg] == '(' || str[beg] == ')')
printf("()");
if(str[beg] == '[' || str[beg] == ']')
printf("[]");
}
else
{
if(pos[beg][End] == -)
{
printf("%c", str[beg]);
Print(beg + , End - );
printf("%c", str[End]);
}
else
{
Print(beg, pos[beg][End]);
Print(pos[beg][End] + , End);
}
}
}
int main()
{
int t;
scanf("%d", &t);
getchar();
getchar();
for(int i = ; i < t; i++)
{
gets(str);
DP();
Print(, n - );
printf("\n");
if(i < t - )
printf("\n");
getchar();
} return ;
}

最新文章

  1. 集合Hashtable Dictionary Hashset
  2. linux cpu性能测试
  3. 大家一起写mvc(一)
  4. UITableViewCell分割线左边部分缺少一些的解决方法
  5. ASP.NET页面间传值总结
  6. Nginx-server_name匹配规则
  7. javascript 中的数据驱动页面模式
  8. Intellij调试debug
  9. 小实验3:实现haproxy的增、删、查
  10. Java基础——枚举详解
  11. Django-404错误处理
  12. first time to use github
  13. 2018.9青岛网络预选赛(J)
  14. java:大小写字母转换
  15. js签名
  16. Github作为图床的一个小坑
  17. Guava之Iterables使用示例
  18. R-tree 一种空间搜索的动态索引结构
  19. 将Socket应用程序从Unix向Windows移植中应注意的几点问题
  20. HTML中name,value属性区分

热门文章

  1. Entity Framework版本历史概览
  2. GIT 专贴
  3. FusionCharts或其它flash的div图层总是浮在最上层? (转)
  4. [iOS翻译]《iOS7 by Tutorials》系列:iOS7的设计精髓(下)
  5. css margin 参数
  6. Javascript的字面量对象以及如何拆解字面量对象
  7. wpf键盘记录器
  8. java中的自增问题
  9. 让Dapper+SqlCE支持ntext数据类型和超过4000字符的存储
  10. NuGet更新引用Dll