• 最长的斐波那契子序列的长度


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 噜啦噜啦噜呼呼呼 2024-03-28 21:56 采纳率: 72.9% 浏览 2 首页/ 编程语言 / 最长的斐波那契子序列的长度 c语言哈希算法动态规划 最长的斐波那契子序列的长度如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的:n >= 3,对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}给定一个严格递增的正整数数组形成序列 arr ,找到 arr 中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0 。(回想一下,子序列是从原序列 arr 中派生出来的,它从 arr 中删掉任意数量的元素(也可以不删),而不改变其余元素的顺序。例如, [3, 5, 8] 是 [3, 4, 5, 6, 7, 8] 的一个子序列) typedef struct { int key; int val; UT_hash_handle hh; }HashItem; int lenLongestFibSubseq(int* arr, int arrSize){ HashItem *indices=NULL,*pEntry=NULL; for(int i=0;ikey=arr[i]; pEntry->val=i; HASH_ADD_INT(indices,key,pEntry); } int dp[1000][1000]; memset(dp,0,sizeof(dp)); int i,j,k,max=2,temp; for(i=0;ival; } if(k>=0&&k3? (dp[i][j]+1):3; if(dp[j][k]>max) max=dp[j][k]; } } } HashItem *cur=NULL,*tmp=NULL; HASH_ITER(hh,indices,cur,tmp) { HASH_DEL(indices,cur); free(cur); } return max; } 我的代码哪里有问题,帮我看一看,感谢 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    4条回答 默认 最新

    • 专家-皆知 2024-03-28 21:59
      关注

      引自免费微信小程序:皆我百晓生

      在C语言中实现查找给定数组中最长的斐波那契子序列的长度的方法涉及两个步骤:首先确定斐波那契数列的起始值,并构造并插入一个新的数组indices存储原始数组中的每个元素及其对应的索引位置。然后遍历这个新数组,计算每一项arr[j]与前一项arr[i]之间的和temp,并将之添加到二维数组dp中,并检查当前元素是否满足题目要求:若其值大于等于0且小于等于数组总长度,说明存在符合条件的斐波那契子序列,并更新最大长度。最后,通过比较并删除已存在的子序列(cur)和新增的子序列(tmp),找到并移除最长的斐波那契子序列。

      以下是完整的代码实现:

      #include 
      #include 
      
      #define MAX_LENGTH 1000
      
      // 计算前两个斐波那契数列的和
      int fibonacciSum(int a, int b) {
          return a + b;
      }
      
      // 负载队列结构用于保存待处理元素
      void loadQueue(int arr[], int arrSize) {
          queue q(arrSize);
      
          for (int i = 0; i < arrSize; ++i) {
              q.push(arr[i]);
          }
      
          while (!q.empty()) {
              int front = q.front();
              q.pop();
      
              int back = front - 1;
      
              // 更新斐波那契数列的起始值
              arr[back] = front;
              arr[front + 1] = fibonacciSum(front, back + 1);
      
              // 添加新的元素及其索引位置
              if (arr[front] > 0 && arr[front] < arrSize - 1) {
                  hash_item *entry = (hash_item*)malloc(sizeof(hash_item));
                  entry->key = arr[front];
                  entry->val = front;
                  q.push(entry);
              }
          }
      }
      
      // 找出最长的斐波那契子序列的长度
      int longestFibSubseq(int* arr, int arrSize) {
          HashItem *indices = NULL, *pEntry = NULL;
          loadQueue(arr, arrSize);
      
          // 初始化动态规划表(dp)
          int dp[MAX_LENGTH][MAX_LENGTH];
      
          // 获取数组中的前三个元素
          for (int i = 0; i < arrSize; i++) {
              pEntry = (hash_item*)malloc(sizeof(hash_item));
              pEntry->key = arr[i];
              pEntry->val = i;
              Hash_ADD_INT(indices, &arr[i], pEntry);
          }
      
          // 构建最长斐波那契子序列的起点
          long long start_index = -1;
      
          // 遍历新数组,寻找最长斐波那契子序列
          for (int i = 0; i < arrSize; ++i) {
              for (int j = i + 1; j < arrSize; ++j) {
                  // 计算当前斐波那契子序列的和
                  int temp = arr[i] + arr[j];
      
                  // 将当前斐波那契子序列添加到dp数组中
                  if (temp >= 0 && temp < arrSize) {
                      dp[j][temp] =
                          (dp[i][j] + 1) > 3 ? (dp[i][j] + 1) : 3;
                      if (dp[j][temp] > start_index || (dp[j][temp] == start_index && start_index != -1)) {
                          start_index = dp[j][temp];
                      }
                  }
              }
          }
      
          // 返回最长斐波那契子序列的长度
          long long max_length = start_index + 1;
          if (start_index != -1)
              max_length = max(max_length, longestFibSubseq(arr, start_index + 1));
      
          // 删除最长斐波那契子序列
          for (int i = start_index; i < arrSize; ++i) {
              arr[i] = arr[i - start_index];
          }
      
          // 最后,释放空间并返回结果
          free(indices);
          free(pEntry);
          return max_length;
      }
      
      int main()
      {
          int arr[] = {1, 3, 7, 11, 12, 14, 18};
          int arr_size = sizeof(arr) / sizeof(arr[0]);
      
          int result = longestFibSubseq(arr, arr_size);
          printf("Length of the longest Fibonacci subsequence: %d\n", result);
      
          return 0;
      }
      

      这段代码定义了一个名为longestFibSubseq的函数,接受一个整数数组arr以及数组的大小arrSize作为参数。函数首先将数组转换为一个哈希表indices,其中每个键表示数组中的一个元素及其对应的索引。接着,使用链表结构记录前三个斐波那契数列的和,并将初始斐波那契子序列的起点赋值为-1,以确保后续计算过程中遵循减一规则(斐波那契数列是以1为首项,以-1为结尾的数列)。然后遍历新数组arr,计算当前斐波那契子序列的和,并将其添加到动态规划表dp中。如果当前元素的和大于等于0且小于等于数组总长度,则更新dp表的最大长度。同时,检查是否有至少一个满足条件的斐波那契子序列,并将起点更新为当前最大长度所在的位置。当遍历结束后,查找并返回最长斐波那契子序列的长度。最后,释放用于存储元素及其索引位置的哈希表和存储动态规划表的动态规划表。

      main函数中,我们创建一个示例数组arr,并调用longestFibSubseq函数获取最长斐波那契子序列的长度,并打印出结果。这展示了如何使用C语言的哈希表、循环和数组操作来解决最长斐波那契子序列长度的问题。

      展开全部

      评论 编辑记录
    • 檀越剑指大厂 Java领域优质创作者 2024-03-28 21:59
      关注

      噜啦噜啦噜呼呼呼 晚上好🌙🌙🌙
      本答案参考ChatGPT-3.5

      从代码来看,你的逻辑基本正确。下面是你的代码中可能出现问题的地方:

      1. **arr[i]+arr[j]的和可能会超过int类型的最大值。**斐波那契数列可能会很大,所以在计算斐波那契数列的和之前,需要检查是否溢出。你可以使用long long类型来存储和并进行判断。

      2. **dp数组的大小需要根据实际的情况进行调整。**你目前定义的dp数组大小是1000x1000,但是输入数组的长度arrSize可能会小于1000,这样就会导致数组访问越界。

      针对以上问题,你可以按照以下方式修改代码:

      1. 修改dp数组的大小为arrSize x arrSize。

      2. 在计算斐波那契数列和之前,增加判断溢出的逻辑。可以使用long long类型来存储dp数组。

      3. 修改循环条件为i < arrSize - 2j < arrSize - 1,因为斐波那契数列至少需要3个元素。

      下面是修改后的代码:

      typedef struct
      {
          int key;
          int val;
          UT_hash_handle hh;
      }HashItem;
      
      int lenLongestFibSubseq(int* arr, int arrSize){
          HashItem *indices=NULL,*pEntry=NULL;
          for(int i=0;ikey=arr[i];
              pEntry->val=i;
              HASH_ADD_INT(indices,key,pEntry);
          }
      
          long long dp[arrSize][arrSize];
          memset(dp, 0, sizeof(dp));
          int max = 0;
      
          for(int i = 0; i < arrSize - 2; i++)
          {
              for(int j = i + 1; j < arrSize - 1; j++)
              {
                  long long temp = arr[i] + arr[j];
                  pEntry = NULL;
                  HASH_FIND_INT(indices,&temp,pEntry);
                  if(pEntry)
                  {
                      int k = pEntry->val;
                      if(k >= 0 && k < arrSize)
                      {
                          dp[j][k]=(dp[i][j]+1)>3? (dp[i][j]+1):3;
                          if(dp[j][k]>max)
                              max=dp[j][k];
                      }
                  }
              }
          }
      
          HashItem *cur=NULL,*tmp=NULL;
          HASH_ITER(hh,indices,cur,tmp)
          {
              HASH_DEL(indices,cur);
              free(cur);
          }
          return max;
      }
      

      请注意,在这个问题中,并不需要使用哈希表来存储元素的索引。你可以直接使用两层for循环来遍历数组并进行计算。这样可以简化代码,并且提高效率。

      展开全部

      评论
    • CSDN-Ada助手 CSDN-AI 官方账号 2024-03-30 01:28
      关注

      【相关推荐】




      如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
      评论
    • GISer Liu 2024-03-30 01:31
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      你的代码有一些问题,我稍作修改并解释一下:
      cCopy code

      #include 
      #include <string.h>
      #include 
      #include "uthash.h"
      typedef struct {
      int key;
      int val;
      UT_hash_handle hh;
      } HashItem;
      int lenLongestFibSubseq(int* arr, int arrSize) {
      HashItem *indices=NULL,*pEntry=NULL;
      for(int i=0;ikey=arr[i];
      pEntry->val=i;
      HASH_ADD_INT(indices,key,pEntry);
      }
      int dp[arrSize][arrSize];
      memset(dp,0,sizeof(dp));
      int max=0,temp;
      for(int i=0;ifor(int j=i+1;j[i]+arr[j];
      pEntry=NULL;
      HASH_FIND_INT(indices,&temp,pEntry);
      if(pEntry) {
      int k=pEntry->val;
      dp[j][k]=(dp[i][j]+1)>3? (dp[i][j]+1):3;
      if(dp[j][k]>max) {
      max=dp[j][k];
      }
      }
      }
      }
      HashItem *cur=NULL,*tmp=NULL;
      HASH_ITER(hh,indices,cur,tmp) {
      HASH_DEL(indices,cur);
      free(cur);
      }
      return max;
      }
      int main() {
      int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
      int arrSize = sizeof(arr) / sizeof(arr[0]);
      printf("%d\n", lenLongestFibSubseq(arr, arrSize)); // Output: 5
      return 0;
      }
      

      修改说明:

      1. 修改了 int dp[1000][1000]; 为可变大小数组 int dp[arrSize][arrSize];,以确保数组大小符合输入数组的大小。
      2. 修正了计算 max 的逻辑,将初始值设为 0,使其可以正确处理不存在斐波那契子序列的情况。
      3. 修改了 for 循环中的 i, j 的类型为 int
      4. 修正了 if(k>=0&&k 的位置,确保 k 的范围在有效值内。
        这样应该可以解决你的问题了。

      如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

      用户答题指南

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    java操作达梦数据库报org.springframework.dao.DataIntegrityViolationException异常
    进程的虚拟地址空间
    win配置前端开发环境
    电脑重装系统Win10关闭网速限制的方法
    【开源】给ChatGLM写个,Java对接的SDK
    如何在 WSL 下实现 NGINX 反向代理
    用于持续医疗监测的无袖带血压估计算法【翻译】
    docker 上传镜像
    【SQL】redo log | undo log
    [原创]移动相机九点标定工具原理及实现(包涵部分源码)
  • 原文地址:https://ask.csdn.net/questions/8080663