C语言
struct mount_st {
int up;
int down;
int is_mountain;
};
#define MAX_ONE(a,b) ((a)>(b)?(a):(b))
int copy(struct mount_st *dst, struct mount_st *src)
{
memcpy(dst, src, sizeof(struct mount_st));
return 1;
}
int longestMountain(int* arr, int arrSize){
struct mount_st *dp = NULL;
int i;
int max = 0;
dp = calloc(arrSize, sizeof(struct mount_st));
for (i = 1; i < arrSize; i++) {
if (dp[i-1].is_mountain) { //上一个迭代山脉状态
if (arr[i] < arr[i-1]) { //延续山脉状态
copy(&dp[i], &dp[i-1]);
dp[i].down += 1;
max = MAX_ONE(max, dp[i].up + dp[i].down + 1);
continue;
}
if(arr[i] > arr[i-1]) {//初始化非山脉状态
dp[i].up = 1;
}
} else { //上一个迭代非山脉状态
if(arr[i] > arr[i-1]) {
dp[i].up = dp[i-1].up + 1;
continue;
}
if(arr[i] < arr[i-1] && dp[i-1].up > 0) { //转山脉状态
copy(&dp[i], &dp[i-1]);
dp[i].is_mountain = 1;
dp[i].down = 1;
max = MAX_ONE(max, dp[i].up + dp[i].down + 1);
continue;
}
}
}
free(dp);
dp = NULL;
return max;
}
思想
动态规划
状态 | 子问题 |
---|---|
山脉 | 1.延续山脉 ;2.未延续山脉初始化 ; |
非山脉 | 1.数据上坡延续;2.数据下坡直接初始化; |
注意点
- 计算山脉长度需要包含山峰节点,即
dp[i].up + dp[i].down + 1
; - 检查
max
是否延续; - 注意在山脉状态下切非山脉状态的初始化,避免漏节点;