算法:动态规划

2019-05-16  本文已影响0人  Zack_H
int rob(int* nums, int numsSize){
    // dp: c[i]=max(c[i-2]+num[i], c[i-1])
    int maxMoney = 0;
    int pre1 = 0;
    int pre2 = 0;
    for (int i=0; i<numsSize; i++){
        if (pre1+nums[i]>=pre2){
            maxMoney = pre1+nums[i];
        }else{
            maxMoney = pre2;
        }
        pre1 = pre2;
        pre2 = maxMoney;
    }
    return maxMoney;
}
int lengthOfLIS(int* nums, int numsSize){
    int dp = 0;
    int lisArr[numsSize+1];
    for (int i=0; i<numsSize; i++){
        if (i==0 || nums[i]>lisArr[dp-1]){
            lisArr[dp] = nums[i];
            dp++;
        }else{
            for (int j=0; j<dp; j++){ // 可用二分查找法,O(logn)
                if (nums[i]<=lisArr[j]){
                    lisArr[j] = nums[i];
                    break;
                }
            }
        }
    }
    return dp;
}
public int maxUncrossedLines(int[] A, int[] B) {
    // Longest common subsequence
    int alen = A.length;
    int blen = B.length;
    int[][] c = new int[alen+1][blen+1];
    for (int i=1; i<alen+1; i++){
        for (int j=1; j<blen+1; j++){
            if (A[i-1]==B[j-1]) // 如果最后的两个值相等
                c[i][j]=c[i-1][j-1]+1;
            else if (c[i-1][j]>c[i][j-1]){ // 如果最后两值不等
                c[i][j] = c[i-1][j]; // 取[i-1][j]和[i][j-1]最大的一个
            }else
                c[i][j] = c[i][j-1];
        }
    }
    return c[alen][blen];
}
上一篇 下一篇

猜你喜欢

热点阅读