zoukankan      html  css  js  c++  java
  • poj 2955 Brackets 区间DP

    题目链接:http://poj.org/problem?id=2955

    不容易啊,终于把这道题A了,还是对区间DP不熟悉啊。。

    思路:

    关键就是怎样进行状态转移;

    我的想法是定义dp[i][j]表示从i到j的最优匹配数,那么对于k(i<=k<=j)

    如果s[i]和s[k]匹配,那么dp[i][j]=max(dp[i+1][k-1]+dp[k+1][j]+2,dp[i][j]);

    否则,dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);

    其实就是对于区间i到j 不断进行划分,取最优啊

    代码:

     1 #include<iostream>
     2 #include<cstdlib>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<string>
     6 using namespace std;
     7 int dp[110][110];
     8 string s;
     9 bool match(int i,int j)
    10 {
    11         if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']'))
    12                 return true;
    13                 return false;
    14 }
    15 int main()
    16 {
    17 
    18    while(cin>>s)
    19   {
    20           int ans=-1;
    21       if(s=="end") break;
    22       memset(dp,0,sizeof(dp));
    23       int n=s.length();
    24       for(int j=1;j<n;j++)
    25          for(int i=j-1;i>=0;i--){
    26                  for(int k=i;k<=j;k++){
    27                          if(match(i,k))
    28                                  dp[i][j]=max(dp[i+1][k-1]+dp[k+1][j]+2,dp[i][j]);
    29                             else dp[i][j]=max(dp[i][k]+dp[k+1][j],dp[i][j]);
    30                          }
    31                  }
    32        cout<<dp[0][n-1]<<endl;
    33    }
    34    return 0;
    35 }
    View Code
  • 相关阅读:
    第一周作业
    模拟赛3 题解
    模拟赛2 题解
    [HNOI2008]GT考试 题解
    NOI Online 提高组 题解
    模拟赛1 题解
    知识点拾遗
    [NOIp2012]疫情控制 题解
    [CEOI2002]Bugs Integrated, Inc. 题解
    [NOIp2017]宝藏 题解
  • 原文地址:https://www.cnblogs.com/xiaozhuyang/p/poj2955.html
Copyright © 2011-2022 走看看