(nice!!!)(LeetCode 每日一题) 3201. 找出有效子序列的最大长度 I (动态规划dp)
题目:3201. 找出有效子序列的最大长度 I
思路:动态规划dp,时间复杂度0(n)。
状态f[x][i]:表示当前数取模后为x时,前一个数取模为i时,构成的子序列的最大值。
状态转移方程:f[x][i]=f[i][x]+1
遍历每一个元素,在内层再遍历所有可能的i,即可。这里只有0、1
C++版本:
class Solution {
public:int maximumLength(vector<int>& nums) {// 状态f[x][i]:表示当前数取模后为x时,前一个数取模为i时,构成的子序列的最大值int f[2][2]={0};// 答案int mx=0;// 遍历每一个元素for(auto x:nums){x%=2;// 再遍历所有可能的ifor(int i=0;i<2;i++){// 状态转移方程:f[x][i]=f[i][x]+1f[x][i]=f[i][x]+1;mx=max(mx,f[x][i]);}}return mx;}
};
JAVA版本:
class Solution {public int maximumLength(int[] nums) {int[][] f=new int[2][2];int mx=0;for(var x:nums){x%=2;for(int i=0;i<2;i++){f[x][i]=f[i][x]+1;mx=Math.max(mx,f[x][i]);}}return mx;}
}
GO版本:
func maximumLength(nums []int) int {f:=make([][]int,2)for i,_:=range f {f[i]=make([]int,2)}mx:=0for _,x:=range nums {x%=2for i:=0;i<2;i++ {f[x][i]=f[i][x]+1mx=max(mx,f[x][i])}}return mx
}