此题目来自牛客网NC155link.
题目描述
一个有n个数组成的数组,取其中一个连续的子序列,并且这个子序列还必须得满足:最多只改变一个数,就可以使得这个连续的子序列是一个严格上升的子序列,求这个连续子序列最长的长度是多少。
示例
输入
[7,2,3,1,5,6]
返回值
5
分析
建立一个二维DP,dp[2][len],第一行记录严格递增长度,第二行记录纵容一次严格递增长度。
代码如下:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums intvector
* @return int
*/
int maxSubArrayLength(vector<int>& nums) {
// write code here
int len =nums.size();
vector<int>copy(nums);
int dp[2][len];
dp[0][0] = 1;//绝对严格递增长度
dp[1][0] = 1;//纵容一次严格递增长度
int res=1;
for(int i=1;i<len;i++){
if(nums[i]>nums[i-1]){
dp[0][i] = dp[0][i-1] + 1;
}
else {
dp[0][i]=1;
}
if(nums[i]>copy[i-1]){
dp[1][i] = dp[1][i-1] + 1;
}
else{
copy[i] = nums[i-1] + 1;
dp[1][i] = dp[0][i-1] + 1;
}
res = max(res,dp[1][i]);
}
return res;
}
};
总结
对于DP的理解:将递归中的数值填入表中,打表完成,即可得出答案。