Entries

スポンサーサイト (この記事を編集する[管理者用])

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://rsujskf.blog32.fc2.com/tb.php/2055-38fa8ab7
この記事にトラックバックする(FC2ブログユーザー)

SRM521 DIV1 EASY/DIV2 MEDIUM - MissingParentheses (この記事を編集する[管理者用])

Source

TopCoder SRM521 DIV1 EASY (250pt)
TopCoder SRM521 DIV2 MEDIUM (500pt)
Problem Statement

問題概要

50文字以下からなる文字列が与えられる.含まれる文字は(か)の二種類のみ.
最小で何個の文字を追加すると,ちゃんと対応付けがうまくいく括弧の列になるかを求める問題.

解法

幾つか解法がある.以下のコードは解法1.

解法1: 左から(がでてくると深さ+1,)がでてくると深さを-1していく.
途中で深さが負になったら,(を補ったことにして,深さを+1する.
最後に深さの分だけ)を補う.

解法2: 置換できなくなるまで"()"を消していく.
最終的に残ったものが対応付けられてないので,それと同じ数だけ括弧が必要.

解法3: DP.

C++によるスパゲッティなソースコード
// #includeとusing namespace std;は略

#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

class MissingParentheses {
public:
int countCorrections(string par) {
  int i,depth = 0;
  int res = 0;

  rep(i,par.size()){
    if(par[i]=='(') depth++;
    else depth--;
    while(depth<0) depth++, res++;
  }

  res += depth;

  return res;
}

};

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://rsujskf.blog32.fc2.com/tb.php/2055-38fa8ab7
この記事にトラックバックする(FC2ブログユーザー)

Appendix

Recent Articles

ブログ内検索

Ads


(プライバシーポリシー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。