O(1) 的小乐

Job Hunting

公告

记录我的生活和工作。。。
<2012年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

统计

  • 随笔 - 182
  • 文章 - 1
  • 评论 - 41
  • 引用 - 0

留言簿(10)

随笔分类(70)

随笔档案(182)

文章档案(1)

如影随形

搜索

  •  

最新随笔

最新评论

阅读排行榜

评论排行榜

SRM 301 U

DIV 2 1000

给定一个字符串([{}])()[]{} 这有这样六种括号,求至少改变多少个括号可以使其变成规则匹配的?

一个经典的DP,O(n^2)的状态空间, 就是字串的数目,然后O(n)的转移方程类似于矩阵乘法。转移方程一定要想清楚

int dp[55][55];
int cost(char a, char b)
{
    if(a == '(' && b==')'|| a=='{' && b=='}'|| a=='[' && b==']') return 0;
    else if(a=='(' || a == '[' || a=='{' || b==')'|| b=='}'|| b==']') return 1;
    else return 2;
}
class CorrectingParenthesization
{
        public:
        int getMinErrors(string s)
        {
            memset(dp, 0 ,sizeof(dp));
            int M = s.size();
            for(int i=1; i<M; i++) // internal
            {
                if(i%2==0) continue;
                for(int j=0; j<M;j++)
                {
                    dp[j][j+i] = dp[j+1][j+i-1] + cost(s[j], s[j+i]);
                    for(int k=1; k<i; k++ )
                    {
                        if(k%2==0) continue;
                        dp[j][j+i] = min(dp[j][j+i], dp[j][j+k]+dp[j+k+1][i+j]);
                    }
                }
            }
            return dp[0][M-1];
        }
};

posted on 2012-06-01 15:57 Sosi 阅读(86) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


统计系统