zoukankan      html  css  js  c++  java
  • nyoj 括号匹配

    这个方程有两种形式,本文采用
    if(s[i]=s[j]) dp[i][j]=d[i-1][j-1]
      dp[i][j]=min(dp[i][k]+dp[k+1][j],dp[i][j]) (i=<k<j)
     
    其实与另一种方法比较:根据j的所有匹配情况取最小值
    1.i到j无匹配,取为dp[i][j-1]+1
    2.列举所有匹配情况 dp[i][k-1]+dp[k+1][j]
    取上述所有情况最小值
     
    两者都能获得正确的结果。
    同时两者的初始化为 dp[i][j]==1 if(i==j)
    规划方向为:
     
       
       
    (1) (2)  (3) (4)填写顺序
    1 (1) (3) (6) (10)
      1 (2) (5) (9)
        1 (4) (8)
          1 (7)
            1
    // ConsoleApplication8.cpp : Defines the entry point for the console application.
    //
    #include "stdafx.h"
    #include<iostream>
    #include<string>
    #include<memory.h>
    using namespace std;
    #define min(x,y) (x < y ? x : y)  
    
    bool isEqual(char c,char b)
    {
        if(c=='('&&b==')') return true;
        if(c=='['&&b==']') return true;
        return false;
    
    }
    
    int main()
    { 
        int dp[102][102];
    
        int len;
        cin>>len;
        while(len--)
        {
             string a;
             cin>>a;
             int len=a.length();
             memset(dp,0,sizeof(dp));//clear
             dp[0][0]=1;
             for(int i=1;i<len;i++)
             {
                 dp[i][i]=1;
                 
                 for(int j=i-1;j>=0;j--)
                 {
                     dp[j][i]=100000;
                     if(isEqual(a[j],a[i]))
                     {
                        dp[j][i]= min(dp[j][i],dp[j+1][i-1]);
                     }
                     for(int k=j;k<i;k++)
                     {
                         dp[j][i]=min(dp[j][k]+dp[k+1][i],dp[j][i]);
                     
                     
                     }
                 
                 
                 
                 }
                 
             
             
             }
             
             cout<<dp[0][len-1]<<endl;
            
        
        
        }
    
    
    }
    // ConsoleApplication8.cpp : Defines the entry point for the console application.
    //
    #include "stdafx.h"
    #include<iostream>
    #include<string>
    #include<memory.h>
    using namespace std;
    #define min(x,y) (x < y ? x : y)  
    
    bool isEqual(char c,char b)
    {
        if(c=='('&&b==')') return true;
        if(c=='['&&b==']') return true;
        return false;
    
    }
    
    int main()
    { 
        int dp[102][102];
    
        int len;
        cin>>len;
        while(len--)
        {
             string a;
             cin>>a;
             int len=a.length();
             memset(dp,0,sizeof(dp));//clear
            // cout<<dp[45][56]<<endl;
             dp[0][0]=1;
             dp[1][1]=1;
             for(int i=2;i<=len;i++)
             {
                 dp[i][i]=1;
                 
                 for(int j=i-1;j>=1;j--)
                 {
                     dp[j][i]=dp[j][i-1]+1; //没有匹配的情况
                     for(int k=j;k<i;k++)
                     {
                     if(isEqual(a[k-1],a[i-1]))
                     {
                        dp[j][i]= min(dp[j][i],dp[j][k-1]+dp[k+1][i-1]);
                     }
                     
                     }
                 
                 
                 }
                 
             
             
             }
             
             cout<<dp[1][len]<<endl;
            
        
        
        }
    
    
    }
  • 相关阅读:
    gorm使用小结
    golang 输入输出
    nginx 命令和配置
    设计模式
    并发
    Java教程
    Spring实战
    第12章 高级数据结构及其实现
    第10章 算法设计技巧
    第9章 图论算法
  • 原文地址:https://www.cnblogs.com/hansongjiang/p/3707952.html
Copyright © 2011-2022 走看看