static object Solve() { var n = int.Parse(Console.ReadLine()); var a = Read(); var dp = new MemoDP2 <long>(n + 1, n + 1, long.MinValue, (t, i, j) => { var v = t[i - 1, j]; if (t[i - 1, j - 1] >= 0) { v = Math.Max(v, t[i - 1, j - 1] + a[i - 1]); } return(v); }); for (int i = 0; i <= n; i++) { dp[i, 0] = 0; } for (int j = 1; j <= n; j++) { dp[0, j] = -1; } return(Enumerable.Range(0, n + 1).Last(j => dp[n, j] >= 0)); }
static object Solve() { var n = int.Parse(Console.ReadLine()); var a = Read(); var rn = Enumerable.Range(0, n).ToArray(); var is0 = Array.FindAll(rn, i => a[i] == 0); // i var is1 = Array.FindAll(rn, i => a[i] == 1); // j var m = is0.Length; var dp = new MemoDP2 <int>(m + 1, n - m + 1, -1, (t, i, j) => { return(Math.Min(t[i - 1, j - 1] + Math.Abs(is0[i - 1] - is1[j - 1]), t[i - 1, j])); }); for (int i = 0; i <= m; i++) { dp[i, 0] = 0; for (int j = i + 1; j <= n - m; j++) { dp[i, j] = 1 << 30; } } return(dp[m, n - m]); }
static object Solve() { var n = int.Parse(Console.ReadLine()); var a = ReadL(); Array.Sort(a); var dp = new MemoDP2 <long>(n, n, -1, (t, i, j) => { return(Math.Min(t[i + 1, j], t[i, j - 1]) + a[j] - a[i]); }); for (int i = 0; i < n; i++) { dp[i, i] = 0; } return(dp[0, n - 1]); }