Editorial for Dãy con chung


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của ladpro98

#include <iostream>
#include <cstdio>
#include <iomanip>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <climits>
#include <numeric>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <utility>
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define REP(i, a, b) for(int i = (a); i <=(b); i++)
#define FORD(i, a, b) for(int i = (a); i > (b); i--)
#define REPD(i, a, b) for(int i = (a); i >=(b); i--)
#define SZ(a) (int((a).size()))
#define ALL(a) (a).begin(), a.end()
#define PB push_back
#define MP make_pair
#define LL long long
#define LD long double
#define II pair<int, int>
#define X first
#define Y second
#define VI vector<int>
const int N = 5005;
const LL oo = 1000000000000000000ll;
using namespace std;
LL F[N][N];
int n, m;
int a[N], b[N];

int main() {
    cin >> n >> m;
    REP(i, 1, n) cin >> a[i];
    REP(i, 1, m) cin >> b[i];
    LL ans = 0;
    REP(i, 0, m) F[i][0] = -oo;
    REP(i, 0, n) F[0][i] = -oo;
    REP(j, 1, m) {
        LL maxF = 0;
        REP(i, 1, n) {
            if (a[i] != b[j])
                F[i][j] = F[i][j - 1];
            else
                F[i][j] = maxF;
            maxF = max(maxF, F[i][j - 1] + abs(b[j] - a[i]));
            ans = max(ans, F[i][j]);
        }
    }
    cout << ans;
    return 0;
}

Code mẫu của skyvn97

#include<cstdio>
#include<cstring>
#include<iostream>
#define MAX   5050
#define FOR(i,a,b) for (int i=(a),_b=(b);i<=_b;i=i+1)
#define REP(i,n) for (int i=0,_n=(n);i<_n;i=i+1)
using namespace std;
typedef long long ll;
const ll INF=(ll)1e18+7LL;
int a[MAX],b[MAX];
ll maxAdd[2][MAX],maxSub[2][MAX];
int n,m;
void init(void) {
    scanf("%d%d",&m,&n);
    FOR(i,1,m) scanf("%d",&a[i]);
    FOR(i,1,n) scanf("%d",&b[i]);
}
void maximize(ll &x,const ll &y) {
    if (x<y) x=y;
}
void optimize(void) {
    memset(maxAdd,-0x3f,sizeof maxAdd);
    memset(maxSub,-0x3f,sizeof maxSub);
    ll res=0;
    FOR(i,1,m) {
        int curI=i&1;
        int prevI=curI^1;
        FOR(j,1,n) {
            maxAdd[curI][j]=max(maxAdd[curI][j-1],maxAdd[prevI][j]);
            maxSub[curI][j]=max(maxSub[curI][j-1],maxSub[prevI][j]);
            if (a[i]==b[j]) {
                ll tmp=0;
                if (maxAdd[prevI][j-1]>-INF) maximize(tmp,maxAdd[prevI][j-1]+a[i]);
                if (maxSub[prevI][j-1]>-INF) maximize(tmp,maxSub[prevI][j-1]-a[i]);
                maximize(maxAdd[curI][j],tmp-a[i]);
                maximize(maxSub[curI][j],tmp+a[i]);
                maximize(res,tmp);
            }
        }
    }
    cout<<res<<endl;
}
int main(void) {
    init();
    optimize();
    return 0;
}

Comments

Please read the guidelines before commenting.


There are no comments at the moment.