记一次Leetcode解题--最长斐波那契子序列的长度--dp

本文介绍了解决LeetCode上最长斐波那契子序列问题的两种方法:暴力破解和动态规划。重点讲解了动态规划的实现思路及代码解析,通过定义dp[i][j]表示以A[i]和A[j]结尾的斐波那契子序列的最大长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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]的意思,这段代码就很容易看懂了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值