using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
public class Test
{
static int GetCountDP(int N, int x, int y, ref StringBuilder candidate, ref List<string> combinations)
{
Console.WriteLine("Trying: {0}", candidate.ToString());
if (N == 0) { candidate.Append(""); Console.WriteLine(candidate.ToString()); combinations.Add(candidate.ToString()); return 0; }
if (N == 1) { candidate.Append("()"); Console.WriteLine(candidate.ToString()); combinations.Add(candidate.ToString()); return 2; }
if (N == 2) { candidate.Append("())"); Console.WriteLine(candidate.ToString()); combinations.Add(candidate.ToString()); return 3; }
if (N == 3) { candidate.Append("()))"); Console.WriteLine(candidate.ToString()); combinations.Add(candidate.ToString()); return 4; }
if (x * y == N) { Console.WriteLine(candidate.ToString()); return x + y; }
if (x * y > N) return N * 2 + N; // max
var ret = new List<int>();
candidate.Insert(0,'(');
int count2 = GetCountDP(N - x-1, x, y + 1, ref candidate, ref combinations) + 1;
candidate.Remove(0, 1);
candidate.Insert(candidate.Length - 1, ')');
int count3 = GetCountDP(N - y-1, x + 1, y, ref candidate, ref combinations) + 1;
candidate.Remove(candidate.Length - 1, 1);
if (N % 2 == 1 && x * y < N)
{
candidate.Append("()");
int count1 = GetCountDP(N - 1, x, y, ref candidate, ref combinations) + 2;
candidate.Remove(candidate.Length - 2, 2);
ret.Add(count1);
}
/*
for (int k = 1; k <= N / 2; k++)
{
int count = GetCountDP(k, 1, 1, ref candidate,ref combinations) + GetCountDP(N - k, 1, 1, ref candidate, ref combinations);
ret.Add(count);
}
*/
ret.Add(count2);
ret.Add(count3);
// Console.WriteLine("{0}", NumConvert(ret));
return ret.Min();
}
public static void Main()
{
var candidate = new StringBuilder("()");
var combinations = new List<string>();
int number = GetCountDP(7,1,1, ref candidate, ref combinations);
var min = combinations.Min(x => x.Length);
Console.WriteLine("{0}", min);
Console.WriteLine("{0}", combinations.First(x => x.Length == min)); ;
Console.WriteLine();
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGV4dDsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CnVzaW5nIFN5c3RlbS5MaW5xOwoKcHVibGljIGNsYXNzIFRlc3QKewoJICAgICAgICBzdGF0aWMgaW50IEdldENvdW50RFAoaW50IE4sIGludCB4LCBpbnQgeSwgcmVmIFN0cmluZ0J1aWxkZXIgY2FuZGlkYXRlLCByZWYgTGlzdDxzdHJpbmc+IGNvbWJpbmF0aW9ucykKICAgICAgICB7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUcnlpbmc6IHswfSIsIGNhbmRpZGF0ZS5Ub1N0cmluZygpKTsKICAgICAgICAgICAgaWYgKE4gPT0gMCkgeyBjYW5kaWRhdGUuQXBwZW5kKCIiKTsgQ29uc29sZS5Xcml0ZUxpbmUoY2FuZGlkYXRlLlRvU3RyaW5nKCkpOyBjb21iaW5hdGlvbnMuQWRkKGNhbmRpZGF0ZS5Ub1N0cmluZygpKTsgIHJldHVybiAwOyB9CiAgICAgICAgICAgIGlmIChOID09IDEpIHsgY2FuZGlkYXRlLkFwcGVuZCgiKCkiKTsgQ29uc29sZS5Xcml0ZUxpbmUoY2FuZGlkYXRlLlRvU3RyaW5nKCkpOyBjb21iaW5hdGlvbnMuQWRkKGNhbmRpZGF0ZS5Ub1N0cmluZygpKTsgcmV0dXJuIDI7IH0KICAgICAgICAgICAgaWYgKE4gPT0gMikgeyBjYW5kaWRhdGUuQXBwZW5kKCIoKSkiKTsgQ29uc29sZS5Xcml0ZUxpbmUoY2FuZGlkYXRlLlRvU3RyaW5nKCkpOyBjb21iaW5hdGlvbnMuQWRkKGNhbmRpZGF0ZS5Ub1N0cmluZygpKTsgcmV0dXJuIDM7IH0KICAgICAgICAgICAgaWYgKE4gPT0gMykgeyBjYW5kaWRhdGUuQXBwZW5kKCIoKSkpIik7IENvbnNvbGUuV3JpdGVMaW5lKGNhbmRpZGF0ZS5Ub1N0cmluZygpKTsgY29tYmluYXRpb25zLkFkZChjYW5kaWRhdGUuVG9TdHJpbmcoKSk7IHJldHVybiA0OyB9CiAgICAgICAgICAgIGlmICh4ICogeSA9PSBOKSB7IENvbnNvbGUuV3JpdGVMaW5lKGNhbmRpZGF0ZS5Ub1N0cmluZygpKTsgcmV0dXJuIHggKyB5OyB9CiAgICAgICAgICAgIGlmICh4ICogeSA+IE4pIHJldHVybiBOICogMiArIE47IC8vIG1heAogICAgICAgICAgICB2YXIgcmV0ID0gbmV3IExpc3Q8aW50PigpOwogICAgICAgICAgICBjYW5kaWRhdGUuSW5zZXJ0KDAsJygnKTsKICAgICAgICAgICAgaW50IGNvdW50MiA9IEdldENvdW50RFAoTiAtIHgtMSwgeCwgeSArIDEsIHJlZiBjYW5kaWRhdGUsIHJlZiBjb21iaW5hdGlvbnMpICsgMTsKICAgICAgICAgICAgY2FuZGlkYXRlLlJlbW92ZSgwLCAxKTsKICAgICAgICAgICAgY2FuZGlkYXRlLkluc2VydChjYW5kaWRhdGUuTGVuZ3RoIC0gMSwgJyknKTsKICAgICAgICAgICAgaW50IGNvdW50MyA9IEdldENvdW50RFAoTiAtIHktMSwgeCArIDEsIHksIHJlZiBjYW5kaWRhdGUsIHJlZiBjb21iaW5hdGlvbnMpICsgMTsKICAgICAgICAgICAgY2FuZGlkYXRlLlJlbW92ZShjYW5kaWRhdGUuTGVuZ3RoIC0gMSwgMSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAoTiAlIDIgPT0gMSAmJiB4ICogeSA8IE4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbmRpZGF0ZS5BcHBlbmQoIigpIik7CiAgICAgICAgICAgICAgICBpbnQgY291bnQxID0gR2V0Q291bnREUChOIC0gMSwgeCwgeSwgcmVmIGNhbmRpZGF0ZSwgcmVmIGNvbWJpbmF0aW9ucykgKyAyOwogICAgICAgICAgICAgICAgY2FuZGlkYXRlLlJlbW92ZShjYW5kaWRhdGUuTGVuZ3RoIC0gMiwgMik7CiAgICAgICAgICAgICAgICByZXQuQWRkKGNvdW50MSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoKICAgICAgICAgICAgZm9yIChpbnQgayA9IDE7IGsgPD0gTiAvIDI7IGsrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IGNvdW50ID0gR2V0Q291bnREUChrLCAxLCAxLCByZWYgY2FuZGlkYXRlLHJlZiBjb21iaW5hdGlvbnMpICsgR2V0Q291bnREUChOIC0gaywgMSwgMSwgcmVmIGNhbmRpZGF0ZSwgcmVmIGNvbWJpbmF0aW9ucyk7CiAgICAgICAgICAgICAgICByZXQuQWRkKGNvdW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAqLwogICAgICAgICAgICByZXQuQWRkKGNvdW50Mik7CiAgICAgICAgICAgIHJldC5BZGQoY291bnQzKTsKICAgICAgICAgICAgLy8gQ29uc29sZS5Xcml0ZUxpbmUoInswfSIsIE51bUNvbnZlcnQocmV0KSk7CiAgICAgICAgICAgIHJldHVybiByZXQuTWluKCk7CiAgICAgICAgfQoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQoJewoJCSAgICB2YXIgY2FuZGlkYXRlID0gbmV3IFN0cmluZ0J1aWxkZXIoIigpIik7CiAgICAgICAgICAgIHZhciBjb21iaW5hdGlvbnMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CiAgICAgICAgICAgIGludCBudW1iZXIgPSBHZXRDb3VudERQKDcsMSwxLCByZWYgY2FuZGlkYXRlLCByZWYgY29tYmluYXRpb25zKTsKICAgICAgICAgICAgdmFyIG1pbiA9IGNvbWJpbmF0aW9ucy5NaW4oeCA9PiB4Lkxlbmd0aCk7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ7MH0iLCBtaW4pOwogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiezB9IiwgY29tYmluYXRpb25zLkZpcnN0KHggPT4geC5MZW5ndGggPT0gbWluKSk7IDsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKCX0KfQ==