动态规划入门刷题

题目一

image-20250206104702383

int min(int a,int b) {
    if (a < b) return a;
    return b;
}
int minCostClimbingStairs(int* cost, int costSize) {
    int f[1010];
    //f[0] = cost[0];
    //f[1] = cost[1];
    for (int i = 2;i <= costSize;i++) {
        f[i] = min(f[i-2] + cost[i-2],f[i-1] + cost[i-1]);
    }
    return f[costSize];
}

题目二

image-20250206105919106

int max(int a,int b) {
    if (a <= b) return b;
    return a;
}
int lengthOfLIS(int* nums, int numsSize) {
    int f[2510];
    for (int i = 0;i < numsSize;i++) {
        f[i] = 1;
        for (int j = 0;j < i;j++) {
            if (nums[i] > nums[j]) f[i] = max(f[i],f[j]+1);
        }
    }
    int res = -1e9;
    for (int i = 0;i < numsSize;i++) {
        res = max(res,f[i]);
    }
    return res;
}

题目三

image-20250206141131665

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int n = coins.size();
        int f[10010];
        memset(f,0x3f,sizeof f);
        f[0] = 0;
        for (int i = 1;i <= amount;i++) {
            for (int j = 0;j < n;j++) {
                if (i >= coins[j]) 
                    f[i] = min(f[i],f[i-coins[j]] + 1);
            }
        }
        return f[amount] > 1e9?-1:f[amount];
    }
};

题目四

image-20250206143551984

class Solution {
public:
    int maxSales(vector<int>& sales) {
        int n = sales.size();
        int f[100010];
        f[0] = sales[0];
        for (int i = 1;i < n;i++) {
            f[i] = max(f[i-1] + sales[i],sales[i]);
        }
        int res = sales[0];
        for (int i = 0;i < n;i++) {
            res = max(res,f[i]);
        }
        return res;
    }
};

题目五

image-20250206150625895

const int N = 110;
class Solution {
public:
int mem[N];
    int dfs(int x) {
        if (mem[x]) return mem[x];
        if (x == 0) return 1;
        int res = 0;
        for (int i = 1;i < x;i++) {
            if (x >= i)
                res = max(res,max(i*(x-i),dfs(x-i)*i));
        }
        return mem[x] = res;
    }
    int integerBreak(int n) {
        return dfs(n);
    }
};
int max(int x, int y){
    return x > y ? x : y;
}

int integerBreak(int n) {
    //  dp[i] 表示对数字i进行拆分,得到的最大乘积为dp[i];
    int* dp = (int*) malloc( sizeof(int) * (n + 1) );
    dp[0] = 0;
    dp[1] = 0;
    dp[2] = 1;

    for(int i = 3; i <= n; i++){
        //  10 -> 1,9->2,8->3,7->4,6->5,5->6,4->7,3->8,2->9,1
        //  循环过i的一半时,后续的计算都是重复的
        for(int j = 1; j <= i / 2; j++){
            //      (i - j)表示不进行拆分 dp[i - j] 表示对(i - j)进行拆分
            dp[i] = max( dp[i], max(j * (i - j), j * dp[i - j]) );
        }
    }

    return dp[n];
}