題目解析:
也就是給一個預約數組,選擇一些數字,讓其總和最大,但不能選擇相鄰的兩個數字
算法原理:
依舊可以根據經驗+題目
以dp[i]位置結尾時,巴拉巴拉
根據題目要求補充完整,dp[i]:選擇到i位置時,此時的最長預約時長
此時在分析,選擇到i位置時i位置是不是有兩種狀態,一種是選i,一種是不選i
也就是說,你選擇完前面的數,從0/1/2/3一直到i這個位置時,此時你面臨i選還是不選
所以第i位置的狀態又可以細分
f[i]:表示選擇到i位置時,i位置必選,此時的最長預約時長
g[i]:表示選擇到i位置是,i位置不選,此時的最長預約時長
狀態轉移方程:
f[i]:如何想?f[i]是選擇到i位置時,必選的時候的最長預約時長,那是不是證明前面的最長預約時長+num[i],那前面的最長預約時長如何找?這里由于選擇了i就不能選i-1,所以我們要找不選i-1的最長時長,那不就是g[i-1]
所以f[i]=g[i-1]+nums[i];
那g[i]:怎么想?g[i]是選擇到i位置時,i不選的最長預約時長,你不選i,那前面就可以選擇i-1或者不選i-1,所以你要在f[i-1]和g[i-1]之間選擇最大的那一個
?初始化:
根據狀態表示很容易得到
填表順序:
當然是從左往右
返回值:
?