int findoptimal(int N)
{
// The optimal string length is N when N is smaller than 7
if (N <= 6)
return N;
// Initialize result
int max = 0;
// TRY ALL POSSIBLE BREAK-POINTS
// For any keystroke N, we need to loop from N-3 keystrokes
// back to 1 keystroke to find a breakpoint 'b' after which we
// will have Ctrl-A, Ctrl-C and then only Ctrl-V all the way.
int b;
for (b=N-3; b>=1; b--)
{
// If the breakpoint is at b'th keystroke
int curr = (N-b-1)*findoptimal(b);
if (curr > max)
max = curr;
}
return max;
}
Explanation
For N = 7
Case1
B = n-3 = 4
AAAA Ctrl-A Ctrl-C Ctrl-V = 8; n-b-1 = 7-4-1 = 2 * findoptimal(4) = 2*4 = 8
Case2
B = 3
AAA Ctrl-A Ctrl-C Ctrl-V Ctrl-V= 9; n-b-1 = 7-3-1 = 3* findoptimal(3) = 3*3 = 9
Case3
B = 2
AA Ctrl-A Ctrl-C Ctrl-V Ctrl-V Ctrl-V = 8; n-b-1 = 7-2-1 = 4* findoptimal(2) = 4*2 = 8
Case4
B = 1
A Ctrl-A Ctrl-C Ctrl-V Ctrl-V Ctrl-V Ctrl-V = 5; n-b-1 = 7-1-1 = 5* findoptimal(1) = 5*1 = 5
For N = 10
B = n-3 = 7
n-b-1 = 10-7-1 = 2*findoptimal(7)