算法珠玑——动态规划(2)

算法珠玑——动态规划(2)

https://leetcode-cn.com/problems/longest-increasing-subsequence/submissions/

随便测的一次。这个代码后面还会改。

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        short n = nums.size();
        int dp[n];
        int maxans = 1;
        
        // V(x)=maxa{F(x,a)+βV(T(x,a))}
        // 基本情况,F[0]=0即dp[0]
        // 本题中,V[0]也等于F[0]
        // the current payoff from taking action a in state x is F(x,a).
        // F(x0, a0)的值
        dp[0] = 1;

        // 最优性原则:最优策略的性质是,无论初始状态和初始决策如何,其余决策都必须构成关于第一个决策产生的状态的最优策略。
        // Principle of Optimality: An optimal policy has the property that whatever the initial state and initial decision are, the remaining decisions must constitute an optimal policy with regard to the state resulting from the first decision. 
        // 满足重叠子问题的最优策略,是关键,即重叠子问题(递归/循环通常用以解决重叠子问题)的同时满足都依赖于第一个决策
        for (short i = 1; i < n; ++i)
        {
            dp[i] = 1;
            // 基本情况: dp[i] = 1, dp[i]前决策dp[j]都已构成关于第一个决策产生的状态的最优策略。
            // 终止情况:j>=i
            for (short j = 0; j < i; ++j)
            {
                // 归纳步骤,dp[i] = max(dp[i], dp[j]+1)
                // 即max a∈Γ(x) 最优子结构的最优策略
                if (nums[j] < nums[i])
                    dp[i] = max(dp[i], dp[j]+1);
            }
            maxans = max(maxans, dp[i]);
        }

        return maxans;
    }
};

动态规划的核心是思想。

posted @ 2021-12-23 20:06  千心  阅读(28)  评论(0编辑  收藏  举报