算法程序员动态规划

LeetCode-2 Keys Keyboard

2017-10-12  本文已影响15人  徐笔笔

package Classify.DP.Medium;

import org.junit.jupiter.api.Test;

/**

public class KeysKeyboard {
/**
* 这题的思路就是 dp 代表的就是当前的 A 的数量,然后我们优先考虑上一步复制过的情况,因为这样能够最快的填满 n 个 A ,但是使用这种情况要注意的就是
* 我们可能上部赋值我们最后收不了尾,所以必须有一个判断就是我们能用上一步的复制的内容填满剩下的 A ,也就是 n % dp[i - 1] == 0
* 里面的内容的意思就是我们使用了上一步的复制的内容那么我们的字符串就直接翻倍,而且我们进行了一次复制,那么我们 count 就得加2
* @param n
* @return
*/
public int minSteps(int n) {
if (n == 1) {
return 0;
}
int[] dp = new int[1000];
dp[0] = 1;
int paste = 1;
int i = 0;
int count = 1;
while (dp[i] <= n) {
++i;
if (n % dp[i - 1] == 0) {
paste = dp[i - 1];
dp[i] = dp[i - 1] * 2;
++count;
if (paste != 1) {
++count;
}
} else {
dp[i] = dp[i - 1] + paste;
++count;
}
if (dp[i] == n) {
return count;
}
}
return count;
}

@Test
public void fun() {
    System.out.println(minSteps(10));
}

}

上一篇 下一篇

猜你喜欢

热点阅读