XDU1131 思维+dp优化

Posted Deadline

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XDU1131 思维+dp优化相关的知识,希望对你有一定的参考价值。

题意

分析

一个直观的做法是,枚举前两项,不断检查前一项,这需要维护一个有序数组并且带下标(可以用一个map<int,vector<int> >,将数字相同的数推倒一个vector中,vector中存的就是相同的数的位置)

时间复杂度:O(n^2*(logn+logn))

这个做法不太行啊,两个log,有点卡不过去

 

由于有很多重复的枚举,dp优化

dp[i][j]:以i,j为开始两个的最大长度

转移:显然需要k且k>j的help,   a[k]=a[i]+a[j] (k>j)即可(二分即可)

 

另一种dp[i][j]:以i,j为结束两个的最大长度

转移:需要k且k<i的help   ,a[k]+a[i]==a[j](k<i)

但这个状态不太好找二分不好check

时间复杂度O(n^2*logn)

技术分享图片
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <iostream>
#include <cmath>
#include <queue>
#include <ctime>
using namespace std;
#define lson l,(l+r)/2,rt<<1
#define rson (l+r)/2+1,r,rt<<1|1
#define dbg(x) cout<<#x<<" = "<< (x)<< endl
#define pb push_back
#define fi first
#define se second
#define ll long long
#define sz(x) (int)(x).size()
#define pll pair<long long,long long>
#define pii pair<int,int>
#define pq priority_queue
vector<pll> v;
int dp[1010][1010];
ll a[1010];
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        v.clear();
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            v.pb({a[i],i});
        }
        if(n==1){
            printf("1\n%lld\n",a[1]);
            continue;
        }
        sort(v.begin(),v.end());
        pll res;int cnt=0;
        for(int i=n-1;i>=1;i--){
            for(int j=i+1;j<=n;j++){
                auto it=lower_bound(v.begin(),v.end(),(pll){a[i]+a[j],j+1});
                if(it!=v.end() && it->fi==a[i]+a[j]){
                    dp[i][j]=dp[j][it->se]+1;
                }else{
                    dp[i][j]=2;
                }
                if(dp[i][j]>cnt || (dp[i][j]==cnt && (pll){a[i],a[j]}<res)){
                    res={a[i],a[j]};
                    cnt=dp[i][j];
                }
            }
        }
        printf("%d\n",cnt);
        printf("%lld %lld",res.fi,res.se);
        for(int i=2;i<cnt;i++){
            printf(" %lld",res.fi+res.se);
            res.fi+=res.se;
            swap(res.fi,res.se);
        }
        printf("\n");
    }
    return 0;
}
View Code

以上是关于XDU1131 思维+dp优化的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces 1131B(思维题)

bzoj 1131 简单树形dp

P1131 [ZJOI2007]时态同步(树形dp)

[树形DP]Luogu P1131 [ZJOI2007]时态同步

LuoguP1131 [ZJOI2007]时态同步 (树形DP,贪心)

CodeForces 1005D Polycarp and Div 3(思维贪心dp)