动态规划30:646. 最长数对链

动态规划解题步骤:

1.确定状态表示:dp[i]是什么

2.确定状态转移方程:dp[i]等于什么

3.初始化:确保状态转移方程不越界

4.确定填表顺序:根据状态转移方程即可确定填表顺序

5.确定返回值

题解:

0.预处理:由于数对链可以用任何顺序选择数对来构造,但是动态规划必须使用已经计算过的dp来推演后面的dp。例如示例2,[1,2]后面可以接[4,5],但是[4,5]的dp还没有计算出来,因此必须先对数对数组进行排序。排序按照数对的第一个元素大小排序,例如排序后的[a,b][c,d],由于a<c<d,即a<d,所以数对[a,b]一定不会接在[c,d]后面

1.状态表示:dp[i]表示以pairs[i]结尾的最长数对链的长度

2.状态转移方程:如果pairs[i][0]>pairs[j][1] dp[i]=max(dp[i],dp[j]+1) 0=<j<i

3.初始化:dp表的最低值为1,所以在创建dp表时全部初始化为1

4.填表顺序:从左向右,依次填写

5.返回值:返回dp表中的最大值

class Solution {
public:
    int findLongestChain(vector<vector<int>>& pairs) {
        //dp[i]表示以pairs[i]结尾的最长数对链的长度
        //如果pairs[i][0]>pairs[j][1] dp[i]=max(dp[i],dp[j]+1) 0=<j<i
        //如果不存在 dp[i]=1

        //排序
        sort(pairs.begin(),pairs.end());
        size_t n=pairs.size();
        //创建dp表
        vector<int> dp(n,1);
        //初始化:全部初始化为1
        //填表
        for(int i=0;i<n;++i)
        {
            for(int j=0;j<n;++j)
            {
                    if(pairs[i][0]>pairs[j][1])
                        dp[i]=max(dp[i],dp[j]+1);
            }
        }
        //返回值
        int ans=0;
        for(auto&e:dp) if(e>ans) ans=e;
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周丕才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值