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.
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