• 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 }


  • 相关阅读:
    azkaben任务调度器
    HQL练习
    Hive基本操作
    Spark cache、checkpoint机制笔记
    2021年元旦云南之旅
    2020年总
    Windows Server 2016 如何恢复.NET Framework 4.6
    numpy和tensorflow中的广播机制
    查看spark RDD 各分区内容
    Spark RDD的默认分区数:(spark 2.1.0)
  • 原文地址:https://www.cnblogs.com/shijianming/p/4140865.html
Copyright © 2020-2023  润新知