zoukankan      html  css  js  c++  java
  • 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("*****
    ");
    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("
    ");
    77     }
    78 }
  • 相关阅读:
    django学习之命令
    832. 翻转图像
    JUC线程池深入刨析
    CountDownLatch、CyclicBarrier、Samephore浅谈三大机制
    深入理解Atomic原子类
    浅谈volatile关键字
    web应用启动的时候SpringMVC容器加载过程
    MySQL锁机制
    TCP拥塞控制
    HTTPS的加密流程(通俗易懂,不可错过)
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4264200.html
Copyright © 2011-2022 走看看