题目
https://leetcode-cn.com/problems/length-of-longest-fibonacci-subsequence/
解题
两种办法:
暴力破解, 这个没什么好说的,记得优化二分查找的范围
动态规划, dp有几种写法,先看代码:
class Solution { public static int lenLongestFibSubseq(int[] A) { int size = A.length; int[][] dp = new int[size][size] ; for(int i = 0 ; i < size ; i++){ for(int j = 0 ; j < size ;j++){ dp[i][j] = 2 ; } } int left , right ; int res = 0 ; for(int i = 2 ; i < size ;i++){ left = 0 ; right = i - 1 ; while(left < right){ int sum = A[left] + A[right] ; if(sum == A[i]){ dp[right][i] = dp[right][i] > (dp[left][right]+1)?dp[right][i] : (dp[left][right]+1) ; res = res >dp[right][i]?res:dp[right][i] ; left++; right--; }else if(sum > A[i] ){ right -- ; }else{ left ++ ; } } } return res ; } }
最重要的是这一段,也就是状态转移方程
if(sum == A[i]){
dp[right][i] = dp[right][i] > (dp[left][right]+1)?dp[right][i] : (dp[left][right]+1) ;
res = res >dp[right][i]?res:dp[right][i] ;
left++;
right--;
}
这道题的dp,dp[i][j]代表以i和j为序列的最后两个下标的序列的最大长度,举个例子:int[] a = {1,2,3,4,5,6,7,8}
,那么dp[1][2] 就代表以2和3为序列的最后两位的长度,这个序列就是1,2,3
,长度为3;
dp[2][4]就是以3,5为最后两位的序列,序列是1,2,3,5
,序列长度是4
理解了dp[i][j]的意思,这段代码就很容易看懂了.