Imagine you have a special keyboard with the following keys:
Key 1: (A)
: Prints one 'A' on screen.
Key 2: (Ctrl-A)
: Select the whole screen.
Key 3: (Ctrl-C)
: Copy selection to buffer.
Key 4: (Ctrl-V)
: Print buffer on screen appending it after what has already been printed.
Now, you can only press the keyboard for N times (with the above four keys), find out the maximum numbers of 'A' you can print on screen.
Example 1:
Input: N = 3 Output: 3 Explanation: We can at most get 3 A's on screen by pressing following key sequence: A, A, A
Example 2:
Input: N = 7 Output: 9 Explanation: We can at most get 9 A's on screen by pressing following key sequence: A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V
Note:
- 1 <= N <= 50
- Answers will be in the range of 32-bit signed integer.
思路:刚开始BFS,TLE,是用DP无疑,但是最后还是要看答案啊。。。。
感觉老是差一截。。。。
多写写前几个DP数组的值,多思考思考dp[n]与之前的dp[0..n-1]之间的关系
ref:http://www.geeksforgeeks.org/how-to-print-maximum-number-of-a-using-given-four-keys/
/*
* DP
* 最重要是多写前几个DP的值发现规律
*/
public class Solution {
public int maxA(int n) {
if(n <= 6) return n; // 多写几个发现下规律嘛
// dp[i]表示i次可以得到的最大的A,所以第i次肯定不是复制,因为那还不如按个A
int[] dp = new int[1+n];
for(int i=1; i<=6; i++) dp[i]=i;
// dp[n]怎么由之前的求出来呢?
// 可以是dp[0..n-1]中的一直按A或者Ctrl_V而来的
for(int i=7; i<=n; i++) {
dp[i] = dp[i-1] + 1;
for(int j=i-3; j>0; j--) {
dp[i] = Math.max(dp[i], dp[j]*(i-j-1));
}
}
return dp[n];
}
}