TOPCODER SAM 686 div1 300

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TOPCODER SAM 686 div1 300相关的知识,希望对你有一定的参考价值。

// TOPCODER SAM 686 div1 300

Problem Statement

带有小中括号的括号序列,问可以去掉多少子串,使得剩下的非空串是合法的。

Constraints

字符串长度不超过 40。

Examples

// ans[i] = count(s[i])
string s[] = {"()[]", "())", "()()", "([)]", "())[]][]([]()]]()]]]"};
int ans[] = {3, 2, 4, 2, 3854};

Solution

寻找反面,等价于有多少非空的子串是合法的。这是一个区间 dp,不难转移。

Code

  1. #include <string.h> 
  2.  
  3. #include <string> 
  4.  
  5. const int N = 123
  6.  
  7. class BracketSequenceDiv1 

  8. int n; 
  9. char str[N]; 
  10. long long dp[N][N]; 
  11.  
  12. public
  13. long long count(std::string std_str) 

  14. n = std_str.size(); 
  15. for (int i = 1; i <= n; ++i) { 
  16. str[i] = std_str[i-1]; 

  17. memset(dp, 0, sizeof(dp)); 
  18. return count(n); 

  19.  
  20. long long count(int n) 

  21. for (int d = 1; d <= n; ++d) { 
  22. for (int i = 1; i + d - 1 <= n; ++i) { 
  23. int j = i + d - 1
  24. dp[i][j] = dp[i][j-1]; 
  25. if (str[j] == ‘)‘) { 
  26. for (int k = i; k < j; ++k) { 
  27. // dp[i k-1] ( dp[k+1, j-1] ) 
  28. if (str[k] == ‘(‘) { 
  29. dp[i][j] += (dp[i][k-1] + 1) * (dp[k+1][j-1] + 1); 



  30. else if (str[j] == ‘]‘) { 
  31. for (int k = i; k < j; ++k) { 
  32. // dp[i, k-1] [ dp[k+1, j-1] ] 
  33. if (str[k] == ‘[‘) { 
  34. dp[i][j] += (dp[i][k-1] + 1) * (dp[k+1][j-1] + 1); 





  35. return dp[1][n]; 

  36. }; 

以上是关于TOPCODER SAM 686 div1 300的主要内容,如果未能解决你的问题,请参考以下文章

Topcoder SRM 608 div1 题解

TOPCODER SRM 686 div2 1000

topcoder srm 335 div1

topcoder srm 320 div1

topcoder SRM712 Div1 LR

topcoder srm 305 div1