zoukankan      html  css  js  c++  java
  • URAL 1183 Brackets Sequence(DP)

    题目链接

    题意 : 给你一串由括号组成的串,让你添加最少的括号使该串匹配。

    思路 : 黑书上的DP。dp[i][j] = min{dp[i+1][j-1] (sh[i] == sh[j]),dp[i][k]+dp[k+1][j](i<=k<j)}.输出的时候递归,其实我觉得输出比dp部分难多了。。。。。

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 
     5 using namespace std ;
     6 
     7 char sh[110] ;
     8 int dp[110][110] ,mark[110][110] ;
     9 //dp数组代表的是从i到j需要添加的最少的括号是多少,mark数组代表的是从i到j在mark[i][j]这个位置添加括号可以使得添加的括号数最少
    10 
    11 void print(int i,int j)
    12 {
    13     if(i > j) return  ;
    14     else if(i == j)
    15     {
    16         if(sh[i] == '('||sh[i] == ')')
    17                 printf("()") ;
    18         else printf("[]") ;
    19     }
    20     else if(mark[i][j] == -1)
    21     {
    22         printf("%c",sh[i]) ;
    23         print(i+1,j-1) ;
    24         printf("%c",sh[j]) ;
    25     }
    26     else
    27     {
    28         print(i,mark[i][j]) ;
    29         print(mark[i][j]+1,j) ;
    30     }
    31 }
    32 int main()
    33 {
    34     while(gets(sh))
    35     {
    36         int len = strlen(sh) ;
    37         memset(dp,0,sizeof(dp)) ;
    38         for(int i = 0 ; i < len ; i++)
    39         {
    40             dp[i][i] = 1 ;
    41         }
    42         for(int l = 1 ; l < len ; l ++)//从小区间推出大区间,枚举长度
    43         {
    44             int temp = len - l ;
    45             for(int i = 0 ; i < temp ; i++)
    46             {
    47                 int j = i + l ;
    48                 dp[i][j] = 99999999 ;
    49                 if((sh[i] == '('&& sh[j] == ')')|| (sh[i] == '['&&sh[j] == ']'))
    50                 {
    51                     dp[i][j] = dp[i+1][j-1] ;
    52                     mark[i][j] = -1 ;
    53                 }
    54                 for(int k = i ; k < j ; k++)
    55                 {
    56                     int temp1 = dp[i][k] + dp[k+1][j] ;
    57                     if(dp[i][j] >= temp1)
    58                     {
    59                         dp[i][j] = temp1 ;
    60                         mark[i][j] = k ;
    61                     }
    62                 }
    63             }
    64         }
    65         print(0,len-1) ;
    66         puts("") ;
    67     }
    68     return 0 ;
    69 }
    View Code
  • 相关阅读:
    poj1273
    JavaSE入门学习23:Java面向对象之构造方法
    NOI 2015 滞后赛解题报告
    LuaInterface简单介绍
    解决在onCreate()过程中获取View的width和Height为0的4种方法
    函数指针和指针函数
    Quartz-中断正在执行的任务
    servlet3.0获取参数与文件上传代码示例
    Servlet学习:(三)Servlet3.0 上传文件
    layui 批量上传文件 + 后台 用servlet3.0接收【我】
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3967262.html
Copyright © 2011-2022 走看看