0w1

CFR 489 B. BerSU Ball ( DP )

Problem - B - Codeforces
題意:
給兩個不一定等長序列,求最大配對數,使得每個配對的權值差不超過 1。
解法:
dp[ i ][ j ] : 已考慮前 i 個第一序列的數,已考慮前 j 個第二序列的數,此時的最大配對數。
dp[ i ][ j ] = max{ dp[ i - 1 ][ j ], dp[ i ][ j - 1 ], dp[ i - 1 ][ j - 1 ] + 1 if A[ i ] == B[ j ] }

int N;
vi A;
int M;
vi B;

void init(){
	cin >> N;
	A = vi( N );
	for( int i = 0; i < N; ++i )
		cin >> A[ i ];
	cin >> M;
	B = vi( M );
	for( int i = 0; i < M; ++i )
		cin >> B[ i ];
}

void preprocess(){
	sort( A.begin(), A.end() );
	sort( B.begin(), B.end() );
}

void solve(){
	vvi dp( A.size() + 1, vi( B.size() + 1 ) );
	for( int i = 0; i <= A.size(); ++i )
		for( int j = 0; j <= B.size(); ++j ){
			if( i < A.size() )
				upmax( dp[ i + 1 ][ j ], dp[ i ][ j ] );
			if( j < B.size() )
				upmax( dp[ i ][ j + 1 ], dp[ i ][ j ] );
			if( i < A.size() and j < B.size() and abs( A[ i ] - B[ j ] ) <= 1 )
				upmax( dp[ i + 1 ][ j + 1 ], dp[ i ][ j ] + 1 );
		}
	cout << dp[ A.size() ][ B.size() ] << endl;
}