2017.9.5
开始接触动态规划的题目,一个上午的时间,绕了不少的弯路。最后在网上看解决方法,才知道使用动态规划。
接下来几天可以多做一些动态规划的题目。
重点就是要找到状态转移方程。
public class Solution {
/**
* @param nums a set of distinct positive integers
* @return the largest subset
*/
/** 学习使用动态规划
* 状态转移方程为 dp[i] = max{dp[i],dp[j]+1]}
*/
public static LinkedList<Integer> largestDivisibleSubset(int[] nums) {
// Write your code here
LinkedList<Integer> res = new LinkedList<Integer>();
int length = nums.length;
if(length == 0){
return null;
}
Arrays.sort(nums);
/** dp 用来记录包含num[i]的最大集合的size;
* pre 用来记录最大集合的路径,也就是记录包含num[i]的最大集合的前一位数字的位置。
* */
int []dp = new int[length];
int []pre = new int[length];
int maxSize = 1;
int maxFlag = 0;
//初始化
for(int i = 0; i < length; i++){
dp[i] = 1;
pre[i] = -1;
}
for(int j = 1; j < length; j++){
for(int i = 0; i < j; i++){
if(nums[j] % nums[i] == 0 && dp[j] < dp[i] + 1){
dp[j] = dp[i] + 1;
pre[j] = i;
if(dp[j] > maxSize){
maxSize = dp[j];
maxFlag = j;
}
}
}
}
res.add(nums[maxFlag]);
while(pre[maxFlag] != -1){
res.add(nums[pre[maxFlag]]);
maxFlag = pre[maxFlag];
}
return res;
}
}