动态规划解题步骤:
1.确定状态表示:dp[i]是什么
2.确定状态转移方程:dp[i]等于什么
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;
}
};