动态规划理解

动态规划

基本思想

动态规划算法与分治法类似,其基本思想也是将待求解问题分解乘若干个子问题,先求子问题,

然后从这些子问题的解得到原问题的解。动态规划中分解得到的子问题往往不是相互独立的。

若用分治法,则分解的子问题数目会太多,导致时间复杂度过高。在动态规划中我们将已解决

子问题的答案保存在一个表,在需要时在找到以求的答案,这样可以避免大量的重复计算,这

便是动态规划的基本思想。

步骤:

(1)找出最优解的性质,并刻画其结构特征

(2)递归定义最优质

(3)以自底向上的方式计算出最优值

(4)根据计算最优值时得到的信息构造最优解

习题递归方程

//单调递增最长子序列
//ans[i]表示以元素a[i]为结尾的最长递增子序列的值
    for(int i=1;i<=n;i++)
        for(int j=0;j<=i;j++)
        {
            if(a[i]>a[j]&&ans[i]<ans[j]+1)
                ans[i]=ans[j]+1;
            res=max(res,ans[i]);
        }
    cout<<res<<endl;   
//租用游艇问题    
//dp[i]表示从1到i花费的最少钱

    for(int i=2;i<n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            cin>>temp;
            if(dp[i]+temp<dp[j])
                dp[j]=dp[i]+temp;
        }
    }
    cout<<dp[n]<<endl; 

结对编程情况

结对编程主要在上机实践时交流比较多,代码之间的风格也存在一定的不同。不同的题目队友有自己的想法

能够多多学习,希望能取长补短更进一步。

原文地址:https://www.cnblogs.com/LjwCarrot/p/9925116.html