POJ 2955 Brackets(区间DP)

快来打我* 2023-06-04 13:57 132阅读 0赞

嗯…

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

一道比较经典的区间dp,注意首先更新dp,然后再转移,转移的时候并没有什么代价,即dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]

AC代码:

ContractedBlock.gif ExpandedBlockStart.gif

  1. 1 #include<cstdio>
  2. 2 #include<iostream>
  3. 3 #include<cstring>
  4. 4 #include<algorithm>
  5. 5
  6. 6 using namespace std;
  7. 7
  8. 8 char s[105];
  9. 9 int dp[1005][1005];
  10. 10
  11. 11 inline bool judge(int x, int y){
  12. 12 if(s[x] == '(' && s[y] == ')') return 1;
  13. 13 if(s[x] == '[' && s[y] == ']') return 1;
  14. 14 return 0;
  15. 15 }//判断
  16. 16
  17. 17 int main(){
  18. 18 while(~scanf("%s", s)){
  19. 19 memset(dp, 0, sizeof(dp));
  20. 20 if(s[0] == 'e') break;
  21. 21 int len = strlen(s);
  22. 22 for(int l = 1; l < len; l++){
  23. 23 for(int i = 0; i < len; i++){
  24. 24 int j = i + l;
  25. 25 if(j > len) break;
  26. 26 if(judge(i, j)){
  27. 27 if(j - i == 1) dp[i][j] = 2;
  28. 28 else dp[i][j] = dp[i + 1][j - 1] + 2;
  29. 29 }//更新dp
  30. 30 for(int k = i; k < j; k++){
  31. 31 dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]);
  32. 32 }//转移
  33. 33 }
  34. 34 }
  35. 35 printf("%d\n", dp[0][len - 1]);
  36. 36 }
  37. 37 return 0;
  38. 38 }

AC代码

转载于:https://www.cnblogs.com/New-ljx/p/11569317.html

发表评论

表情:
评论列表 (有 0 条评论,132人围观)

还没有评论,来说两句吧...

相关阅读

    相关 poj 2253(区间DP

    [原题][Link 1] 思路:求所有路径中最大跳跃距离的最小值, 很诡异的是输出答案如果用G++,.3lf%格式会出错,c++可以过 include<cstdio

    相关 POJ1179 Polygon(区间dp

    题意:多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“\”。所有边依次用整数从1到n编号,游戏第1