求最值问题,不用输出具体的结果,只需要输出长度,那么就可以使用动态规划,确定了方法,就可以根据方法的模板来写。
首先确定状态,这里的dp数组为2行n列
dp[0][j]表示以第j个数字为结尾的,且当前为升序列,也就是第j个数大于第j-1个数。
dp[1][j]表示以第j个数字为结尾的,且当前为降序列,也就是第j个数小于第j-1个数。
第一行代表状态为升,第二行代表状态为减
那么就有了状态转移方程:
如果当前状态为升,那么dp[0][j]=dp[1][j-1]+1;
如果当前状态为降,那么dp[1][j]=dp[0][j-1]+1;
最终结果就是求dp中的最大值,这就遍历了所有的情况
class Solution {
public:
int maxTurbulenceSize(vector<int>& arr) {
int n=arr.size(),res=0;
if(n==1) return 1;
vector <vector <int> >dp(2,vector <int> (n,1));
for(int j=1;j<n;j++) {
if(arr[j]<arr[j-1]) {
dp[1][j]=dp[0][j-1]+1;
}
else if(arr[j]>arr[j-1]) {
dp[0][j]=dp[1][j-1]+1;
}
res=max(res,max(dp[0][j],dp[1][j]));
}
return res;
}
};