zoukankan      html  css  js  c++  java
  • 区间dp——POJ

    题目含义

    不是完美匹配,找出匹配的括号数目

    题目分析

    括号匹配有两种,一种是括号里有括号(()),一种是括号在外面()()

    所以如果s[i]与s[j]匹配,那么dp[i][j]=dp[i+1][j-1]+2

    同时要不断在i与j之间找间隔点,找出最大的dp[i][k]+dp[k+1][j]

    对我来说,区间更新难的是循环顺序需要想好

    这里先循环区间的长度,再循环起点

    长度为1时所有dp都只可能为0,长度为2时可以保证相邻的()不会被漏掉

    这样在找更长长度时就不会漏掉了

    题目代码

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    using namespace std;
    typedef long long LL;
    char str[200];
    int dp[200][200];
    int main(){
        while(scanf("%s",&str)){
            if(!strcmp(str,"end"))return 0;
            int n=strlen(str);
            memset(dp,0,sizeof(dp));
            for(int len=1;len<=n;len++)
            for(int i=0;i+len-1<n;i++){
                int ends=i+len-1;
                if((str[i]=='('&&str[ends]==')')||(str[i]=='['&&str[ends]==']'))
                    dp[i][ends]=dp[i+1][ends-1]+2;
                for(int k=i;k<ends;k++)
                    dp[i][ends]=max(dp[i][ends],dp[i][k]+dp[k+1][ends]);
            }
            printf("%d
    ",dp[0][n-1]);
        }
        return 0;
    }
    

      

  • 相关阅读:
    位运算 & 网络序字节序
    TFTP & commons-net-3.3.jar
    存储过程
    poj1185-炮兵阵地(状态压缩dp)
    hdu4570-区间dp
    codevs1026-dp(记忆化搜索)
    hdu1494 跑跑卡丁车(动态规划)
    hdu5094-Maze
    hdu4403- A very hard Aoshu problem(搜索)
    hdu2510-符号三角形(dfs+打表)
  • 原文地址:https://www.cnblogs.com/helman/p/11246556.html
Copyright © 2011-2022 走看看