0w1

CFR 467 C. George and Job ( DP )

Problem - C - Codeforces
題意:
給一個序列,取 K 段相互不重疊的長度為 M 的連續區間,求可能最大權值和。
解法:
dp[ i ][ j ] : 已考慮序列中前 i 個值,已取 j 塊連續區間,此時的最大權值和。

int N, M, K;
vi A;

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

vl pA;
vvl dp;

void preprocess(){
	pA = vl( N + 1 );
	for( int i = 0; i < N; ++i )
		pA[ i + 1 ] = pA[ i ] + A[ i ];
	dp = vvl( N + 1, vl( K + 1 ) );
	for( int i = 0; i < N; ++i )
		for( int k = 0; k <= K; ++k ){
			upmax( dp[ i + 1 ][ k ], dp[ i ][ k ] );
			if( i + M <= N and k + 1 <= K )
				upmax( dp[ i + M ][ k + 1 ], dp[ i ][ k ] + pA[ i + M ] - pA[ i ] );
		}
}

void solve(){
	cout << dp[ N ][ K ] << endl;
}