zoukankan      html  css  js  c++  java
  • poj2955_区间dp

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

    题目大意:括号匹配,(s)表示字符串s外有一对括号,它是合法的,那么他的最大个数就可以是 s包含的个数+2;ab是合法的,表示字符串ab的长度可以是a包含的个数+b包含的个数

    理解题意就简单多了

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <cstdlib>
     6 #include <cmath>
     7 #include <set>
     8 #include <map>
     9 #include <vector>
    10 using namespace std;
    11 
    12 char a[110], b[5] = "end";
    13 int dp[110][110];
    14 int main()
    15 {    
    16     while(~scanf("%s", a))
    17     {        
    18         if(strcmp(a, b) == 0)
    19             break;
    20         memset(dp, 0, sizeof(dp));
    21         int len = strlen(a);
    22         for(int l = 1; l < len; l++)//表示长度
    23         {
    24             for(int i = 0, j = l; j < len; i++, j++)//i为起点,j为终点
    25             {
    26                 if(a[i] == '(' && a[j] == ')' || (a[i] == '[' && a[j] == ']'))
    27                     dp[i][j] = dp[i + 1][j - 1] + 2;
    28                 for(int k = i; k <= j; k++)//注意k从i开始,因为不算起点可能个数最大啊,终点也是也是一样哦(不过k<j也是可行的,自己想想吧)
    29                     dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]);
    30                // cout << i << " " << j << " " << dp[i][j] << endl;
    31             }
    32         }
    33         printf("%d
    ", dp[0][len - 1]);
    34     }
    35     return 0;
    36 }
  • 相关阅读:
    过滤非GBK字符
    打印整数数字
    std::string 方法列表
    设计模式——单例模式(Singleton )
    编程之美二进制一的个数
    Jsoncpp试用指南
    GCC下宏扩展后的++i
    关于字节对齐的sizeof的讨论
    Notepad++ 更改和定制主题
    求子数组的最大和
  • 原文地址:https://www.cnblogs.com/luomi/p/5536333.html
Copyright © 2011-2022 走看看