51nod1055 最长等差数列

本文介绍了一种求解最长等差数列的算法,针对$nleq10000$的不同数字集合,通过定义状态$f(i,j)$表示以$i,j$结尾的最长等差数列长度,并采用枚举法进行状态转移,最终找出最长等差数列的长度。

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

$n \leq 10000$的不同数字,问能组成的最长等差数列。

$f(i,j)$--$i,j$结尾的最长等差数列。枚举中间$i$,往左右扩展,找$j,k$,用$f(j,i)$来更新$f(i,k)$。

$n \leq 100000$的暂时不会。

 1 //#include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 //#include<time.h>
 5 //#include<complex>
 6 //#include<set>
 7 //#include<queue>
 8 //#include<vector>
 9 #include<algorithm>
10 #include<stdlib.h>
11 using namespace std;
12 
13 #define LL long long
14 int qread()
15 {
16     char c; int s=0,f=1; while ((c=getchar())<'0' || c>'9') (c=='-') && (f=-1);
17     do s=s*10+c-'0'; while ((c=getchar())>='0' && c<='9'); return s*f;
18 }
19 
20 //Pay attention to '-' , LL and double of qread!!!!
21 
22 int n;
23 short f[10002][10002];
24 int a[10011];
25 int main()
26 {
27     n=qread();
28     for (int i=1;i<=n;i++) a[i]=qread();
29     sort(a+1,a+1+n);
30     for (int i=1;i<=n;i++)    
31         for (int j=i+1;j<=n;j++)
32             f[i][j]=2;
33     for (int i=1;i<=n;i++)
34     {
35         int j=i-1,k=i+1,v=a[i]*2;
36         while (j && k<=n)
37         {
38             int u=a[j]+a[k];
39             if (u<v) k++;
40             else if (u>v) j--;
41             else if (u==v) {f[i][k]=max(f[i][k],short(f[j][i]+1)); j--; k++;}
42         }
43     }
44     int ans=0;
45     for (int i=1;i<=n;i++)
46         for (int j=i+1;j<=n;j++)
47             ans=max(ans,(int)f[i][j]);
48     printf("%d\n",ans);
49     return 0;
50 }
View Code

 

转载于:https://www.cnblogs.com/Blue233333/p/9169339.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值