xmu 1033.Brackets sequence
来源:互联网 发布:mac 画系统架构图软件 编辑:程序博客网 时间:2024/06/08 09:10
http://blog.csdn.net/mr_jj_lian/article/details/6820538
//这道DP可以把字符串的长度看成是一个状态,长字符串是由子字符串的最优解得到,当字符串长度为1时均赋值为1,则当字符str[i]与str[j]匹配时,这时dp[i][j]=min(dp[i],dp[i+1][j-1])。对于不能品配的字符串dp[i][j]赋值为max;接着对长字符串进行DP一遍即可。
//如何记录输出的情况呢?这里采用的递归的思想,对之前记录的path值进行讨论,如果path[i][j]等于-1时,即匹配成功,这时输出前面的字符,接着继续递归;如果path[i][j]!=-1;这时则分别递归i到k,和k+1,j。
#include <stdio.h>
#include <string.h>
char str[105];
int path[105][105];
void print(int i,int j)
{
if(i>j) return ;
if(i==j)
{
if(str[i]=='['||str[i]==']')
printf("[]");
else printf("()");
}
else if(path[i][j]==-1)
{
printf("%c",str[i]);
print(i+1,j-1);
printf("%c",str[j]);
}
else
{
print(i,path[i][j]);
print(path[i][j]+1,j);
}
}
int main()
{
int dp[105][105];
int i,j,r,k;
while(gets(str))
{
int len=strlen(str);
/*
*注意此处
*/
if(len==0)
{
printf("\n");
continue;
}
memset(dp,0,sizeof(dp));
//初始化
for(i=0;i<len;i++)
dp[i][i]=1;
for(r=1;r<len;r++)
{
for(i=0;i<len-r;i++)
{
int j=r+i;
dp[i][j]=99999999;
if((str[i]=='(' && str[j]==')') ||(str[i]=='[' && str[j]==']'))
{
if(dp[i][j]>dp[i+1][j-1])
dp[i][j]=dp[i+1][j-1];
path[i][j]=-1;
}
for(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;
}
}
}
}
print(0,len-1);
printf("\n");
}
}
//如何记录输出的情况呢?这里采用的递归的思想,对之前记录的path值进行讨论,如果path[i][j]等于-1时,即匹配成功,这时输出前面的字符,接着继续递归;如果path[i][j]!=-1;这时则分别递归i到k,和k+1,j。
#include <stdio.h>
#include <string.h>
char str[105];
int path[105][105];
void print(int i,int j)
{
if(i>j) return ;
if(i==j)
{
if(str[i]=='['||str[i]==']')
printf("[]");
else printf("()");
}
else if(path[i][j]==-1)
{
printf("%c",str[i]);
print(i+1,j-1);
printf("%c",str[j]);
}
else
{
print(i,path[i][j]);
print(path[i][j]+1,j);
}
}
int main()
{
int dp[105][105];
int i,j,r,k;
while(gets(str))
{
int len=strlen(str);
/*
*注意此处
*/
if(len==0)
{
printf("\n");
continue;
}
memset(dp,0,sizeof(dp));
//初始化
for(i=0;i<len;i++)
dp[i][i]=1;
for(r=1;r<len;r++)
{
for(i=0;i<len-r;i++)
{
int j=r+i;
dp[i][j]=99999999;
if((str[i]=='(' && str[j]==')') ||(str[i]=='[' && str[j]==']'))
{
if(dp[i][j]>dp[i+1][j-1])
dp[i][j]=dp[i+1][j-1];
path[i][j]=-1;
}
for(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;
}
}
}
}
print(0,len-1);
printf("\n");
}
}
- xmu 1033.Brackets sequence
- 【动态规划】POJ 1161 & ZOJ1463 & XMU 1033 Brackets sequence
- Brackets Sequence
- Brackets Sequence
- Brackets sequence
- Brackets Sequence
- Brackets Sequence
- Brackets Sequence
- 【动态规划】XMU 1583 Sequence
- DP之Brackets Sequence
- ZOJ 1463 Brackets Sequence
- PKU1141 Brackets Sequence
- POJ 1141 Brackets Sequence
- pku 1141 Brackets Sequence
- POJ1141 Brackets Sequence
- POJ 1141 Brackets Sequence
- Brackets Sequence--poj--1141
- PKU1141 brackets sequence
- Javascript框架,你常用其中的几个?
- 7款Flash和javascript网页视频播放器
- Qt实现动态切换语言
- 实习总结(七)---Struts 2中的程序国际化
- QString与int之间的转换
- xmu 1033.Brackets sequence
- scrollHeight,offsetHeight,clientHeight的本质区别
- 20120716(2)
- Python+Eric+PyQt的安装配置和第一个程序HelloWorld
- 扩展CXF, 支持LoadBalance负载均衡
- HDU I hate it(线段树)
- 刘洋别回家 家里没水没电
- android调用相机和相册
- 一步一步复习数据结构和算法基础-二叉树基本操作