// Guilherme A. Pinto, sequencia, O(NH) #include using namespace std; #define MAXH 20 vector> dp; vector s,m; int N,L,H; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> L >> H; s = vector(N); m = vector(N); for( int i = 0; i < N; i++ ) cin >> s[i]; for( int i = 0; i < N; i++ ) cin >> m[i]; int MIN = numeric_limits::min(); int res = MIN; dp = vector>(N,vector(MAXH+1,MIN)); // dp[i][k] = (soma do) sufixo da sequencia s_0,...,s_i, de soma maxima, // contendo exatamente k elementos marcados // base if ( m[0] == 1 ){ // marcado dp[0][0] = 0; dp[0][1] = s[0]; } else { // nao marcado dp[0][0] = max( 0, s[0] ); } // recursao for( int i = 1; i < N; i++ ){ for( int k = 0; k <= H; k++ ){ if ( m[i] == 1 ) { // marcado if ( k == 0 ) dp[i][0] = 0; if ( k > 0 and dp[i-1][k-1] > MIN ) dp[i][k] = dp[i-1][k-1]+s[i]; } else { // nao marcado if ( k == 0 ) dp[i][0] = max( 0, dp[i-1][0]+s[i] ); if ( k > 0 and dp[i-1][k] > MIN ) dp[i][k] = dp[i-1][k]+s[i]; } } // maximo global for( int k = L; k <= H; k++ ) if ( dp[i][k] > MIN ) res = max( res, dp[i][k] ); } cout << res << endl; return 0; }