51nod1055 最长等差数列


【题解】

  DP题,用f[i][j]表示以i为最后一个数、以j为倒数第二个数的等差数列的长度。转移显然,不过在寻找满足a[i]-a[j]=a[j]-a[k]的k的时候,要注意随着i的递增,k其实是递减的,所以总的复杂度可以降到n^2.

  

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define N 10010
 4 #define rg register
 5 using namespace std;
 6 short n,f[N][N],ans;
 7 int a[N];
 8 inline int read(){
 9     int k=0,f=1; char c=getchar();
10     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
11     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
12     return k*f;
13 }
14 inline short max(short x,short y){return x>y?x:y;}
15 int main(){
16     n=read();
17     for(rg int i=1;i<=n;i++) a[i]=read();
18     sort(a+1,a+1+n);
19     for(rg int i=0;i<=n;i++)
20     for(rg int j=0;j<=n;j++) f[i][j]=2;
21     for(rg int i=1;i<=n-1;i++){
22         int pre=i-1;
23         for(rg int j=i+1;j<=n;j++){
24             while(pre&&a[j]-a[i]>a[i]-a[pre]) pre--;
25             if(!pre) break;
26             if(pre&&a[j]-a[i]==a[i]-a[pre]) f[j][i]=max(f[j][i],f[i][pre]+1);
27             ans=max(ans,f[j][i]);
28         }
29     }
30     printf("%d\n",ans);
31     return 0;
32 }
View Code

优质内容筛选与推荐>>
1、D-LINK DI-524无线路由器变身DI-624,解决BT断线问题
2、LINQ标准查询操作符(四) —AsEnumerable,Cast,OfType,ToArray,ToDictionary,ToList,ToLookup,First,Last,ElementAt
3、淘宝性能测试线下测试与线上跟踪体系
4、SQL经典模式--列转行[转载]
5、【原创】作为客户机的Windows Server 2008安装设置指南


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn