zoukankan      html  css  js  c++  java
  • DP 之 poj 2955

    如欲有渐进的学习过程,请 点击打开此处链接
    //  [4/4/2014 Sjm]
    /*
    状态: dp[i][j] := 从位置 i 到位置 j,最长规则串的长度
    决策:
    1) 若 str[i] == '(' && str[j] == ')',则 dp[i][j] = max(dp[i][j], dp[i + 1][j - 1] + 2);
      (S)= S最长的规则串的长度 + 2
    2)若 j-i >= 1, 则:
    for (int k = i; k < j; k++)
    dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]);
    // 将 S 拆成两个部分 S1 和 S2, 若 S1 和 S2 均已求得规则串的最长长度,
    // 则此时 S 也可获得规则串的一个长度
    */
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 const int MAX_N = 100;
     7 int dp[MAX_N][MAX_N];
     8 char str[MAX_N];
     9 
    10 int Solve()
    11 {
    12     memset(dp, 0, sizeof(dp));
    13     int mylen = strlen(str);
    14     for (int t = 1; t < mylen; t++) {
    15         for (int i = 0; i < mylen - t; i++) {
    16             int j = i + t;
    17             if (('(' == str[i] && ')' == str[j]) || ('[' == str[i] && ']' == str[j]))
    18                 dp[i][j] = max(dp[i][j], dp[i + 1][j - 1] + 2);
    19             for (int k = i; k < j; k++)
    20                 dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]);
    21         }
    22     }
    23     return dp[0][mylen - 1];
    24 }
    25 
    26 int main()
    27 {
    28     //freopen("input.txt", "r", stdin);
    29     //freopen("output.txt", "w", stdout);
    30     while (scanf("%s", str) && str[0] != 'e')
    31         printf("%d
    ", Solve());
    32     return 0;
    33 }


  • 相关阅读:
    10.28MySQL的介绍和安装
    10.24 Event事件,进程池与线程池,协程
    10.23GIL全局解释器锁,多线程作用,死锁,递归锁,信号量
    10.22进程互斥锁,队列,堆栈,线程
    10.21 操作系统发展史,进程
    10.18(粘包问题与解决方法,UDP,socketserver)
    day 67小结
    day 67作业
    day 66 小结
    day 66作业
  • 原文地址:https://www.cnblogs.com/shijianming/p/4140865.html
Copyright © 2011-2022 走看看