这道题,我最开始的想法是解决两个问题:
1、得到两个数的公约数;
2、确保区间最大;
实现不了,因为这是很暴力的解法。
答案:
1、局部最优得到全局最优 —> 动态规划
2、从左至右遍历元素
3、根据他们的公约数,存储其答案;dp存储的内容为:某个公约数当前的分区个数。(很拗口啊)
public class Solution {
public int splitArray(int[] nums) {
int[] dp = new int[1000001];
Arrays.fill(dp,131313131);// 赋值一个很大的质数
int pre=0, now=0; // pre: 前一位 dp 值, now: 当前位 dp 值
for (int x : nums) {
now = 100000;
for (int i = 2; i * i <= x; ++i) {
if ((x % i)==0) {
now = Math.min(now, dp[i] = Math.min(dp[i], 1 + pre));//dp[i] 前面的,有相同共因数,当前答案为这个公因数的位置的值,否则就为当前最大值+1分区
do {x /= i;} while ((x %i)==0);// 试图找到now最小值,还会继续上面的步骤
}
}
if (x > 1) now = Math.min(now, dp[x] = Math.min(dp[x], 1 + pre));
pre = now;
}
return now;
}
}