poj 1141 区间dp
题意:最少添加括号,并输出
链接:点我
第一个区间dp题,果断百度的
蛮好理解,这里直接粘贴别人的题解啦,d是区间内需要添加的括号数
对于任何s[i]..s[j]应该分为两种情况考虑,一种是s[i]='('&& amp;s[j]=')' 或者s[i]='['&&s[j]=']',如果是这种情况,则d[i][j]=d[i+1][j-1],则i,j处不需要添加括号。做 一标记v[i][j]=-1;即可。还有一种情况就是上述条件不满足,则可以把s[i]..s[j]分成两段考虑,枚举i,j中间的点k,i=< k<j;即可。然后取d[i][j]=min(d[i][j],d[i][k]+d[k+1][j]);同时应该对所取得k进行标记v[i] [j]=k。
然后就是输出问题,对任意的s[i]..s[j],对其输出,如果i>j则输出 结束。否则分几种情况考虑:1.i=j;则此时i,j指的就是一个单个字符,如果s[i]='('or')'直接输出一对括号即可。等于'['同上。但是 一般的情况都是i,j中间还有字符,要分两种情况,如果v[i][j]=-1;即标记时s[i]、s[j]是一对,此时输出 s[i],s[i+1]..s[j-1],s[j]即可。如果更一般的情况即v[i][j]不等于-1的时候就是说s[i]..s[j]已经在i,j中间 分开,那么仍然是递归输出s[i]...s[v[i][j]],s[v[i][j]+1]...s[j]即可。至此输出完成。
2015-05-03:之前的代码不对,这里必须要用gets
2015-07-19:区间dp专题复习系列,重做纪念一下
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 #define cl(a) memset(a,0,sizeof(a)) 13 #define ts printf("*****\n"); 14 const int MAXN=1005; 15 int n,m,tt,len; 16 int flag[MAXN][MAXN]; 17 char s[MAXN]; 18 int dp[MAXN][MAXN]; //i到j之间需要添加的最小括号数 19 void fun() 20 { 21 for(int i=0;i<len;i++) dp[i][i]=1; 22 for(int l=1;l<len;l++) //区间长度 23 { 24 for(int i=0;i+l<len;i++) //起始位置 25 { 26 int j=i+l; 27 dp[i][j]=99999; 28 if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']'))//1@ 29 { 30 dp[i][j]=dp[i+1][j-1]; 31 flag[i][j]=-1; 32 } 33 for(int k=i;k<j;k++) 34 { 35 if(dp[i][j]>dp[i][k]+dp[k+1][j]) 36 { 37 dp[i][j]=dp[i][k]+dp[k+1][j]; 38 flag[i][j]=k; 39 } 40 } 41 } 42 } 43 } 44 void printpath(int i,int j) 45 { 46 if(i>j) return; 47 if(i==j) 48 { 49 if(s[i]=='('||s[i]==')')printf("()"); 50 if(s[i]=='['||s[i]==']')printf("[]"); 51 } 52 else if(flag[i][j]==-1) 53 { 54 printf("%c",s[i]); 55 printpath(i+1,j-1); 56 printf("%c",s[j]); 57 } 58 else 59 { 60 printpath(i,flag[i][j]); 61 printpath(flag[i][j]+1,j); 62 } 63 } 64 int main() 65 { 66 int i,j,k; 67 #ifndef ONLINE_JUDGE 68 freopen("1.in","r",stdin); 69 #endif 70 while (gets(s)) 71 { 72 memset(dp,0,sizeof(dp)); 73 len=strlen(s); 74 fun(); 75 printpath(0,len-1); 76 printf("\n"); 77 } 78 }