题目:3176. 求出最长好子序列 I
思路:动态规划dp。细节看注释
class Solution {
public:
int maximumLength(vector<int>& nums, int k) {
//状态dp[i][c]表示:以第i个元素nums[i]为结尾,且前面与nums[i]不同的元素有c个的情况下,最长的“好子序列”长度。
int dp[510][30];
//初始化为-1,表示非法状态
memset(dp,-1,sizeof dp);
//最长的“好子序列”长度
int mx=0;
//遍历每一个以nums[i]为结尾的“好子序列”
for(int i=0;i<nums.size();i++){
//以第i个元素nums[i]为结尾,且前面与nums[i]不同的元素有0个的情况下,最长的“好子序列”长度为1。
dp[i][0]=1;
//遍历前面与nums[i]不同的元素有c个的情况下
for(int c=0;c<=k;c++){
//开始遍历之前的元素
for(int j=i-1;j>=0;j--){
//不同时,ans=1
int ans=(nums[i]!=nums[j]);
if(c-ans>=0) dp[i][c]=max(dp[i][c],dp[j][c-ans]+1);
}
//记录最长的“好子序列”
mx=max(mx,dp[i][c]);
}
}
return mx;
}
};