5
public int numberOfSets(int n, int k) {7
this.memo = new Integer[n + 1][k + 1][2];11
int dp(int i, int k, int isStart) {12
if (memo[i][k][isStart] != null) return memo[i][k][isStart];13
if (k == 0) return 1; // Found a way to draw k valid segments14
if (i == n) return 0; // Reach end of points16
int ans = dp(i + 1, k, isStart); // Skip ith point17
if (isStart == 1) ans += dp(i + 1, k, 0); // Take ith point as start18
else ans += dp(i, k - 1, 1); // Take ith point as end20
return memo[i][k][isStart] = ans % 1_000_000_007;