func_code_string: #include <bits/stdc++.h>   using namespace std;   int ans[3][1010], dp[3][1010][55][55];   int n, p, k, r, s, x;   int teto(int a, int b) { return (a + b - 1) / b; }   int main() {     while (scanf( %d %d %d , &n, &p, &k) != EOF) {       memset(ans, 0, sizeof(ans));       scanf( %d , &r);       for (int i = 0; i < r; i++) {         scanf( %d , &x);         x--;         ans[0][x] = 1;       }       scanf( %d , &s);       for (int i = 0; i < s; i++) {         scanf( %d , &x);         x--;         ans[1][x] = 1;       }       if (p >= 2 * teto(n, k)) {         int cnt = 0;         for (int i = 0; i < n; i++) {           if (ans[0][i] == 1 || ans[1][i] == 1) {             cnt++;           }         }         printf( %d n , cnt);         continue;       }       int A = min(n, k), B = min(n, k);       for (int pos = n; pos >= 0; pos--) {         int pos1 = pos % 2, pos2 = (pos + 1) % 2;         for (int used = 0; used <= p; used++) {           for (int a = 0; a <= A; a++) {             for (int b = 0; b <= B; b++) {               if (pos == n) {                 dp[pos1][used][a][b] = 0;               } else {                 int max_ =                     dp[pos2][used][max(a - 1, 0)][max(b - 1, 0)] +                     max((a >= 1) * (ans[0][pos]), (b >= 1) * (ans[1][pos]));                 if (used + 1 <= p) {                   max_ =                       max(max_, dp[pos2][used + 1][k - 1][max(0, b - 1)] +                                     max(ans[0][pos], (b >= 1) * (ans[1][pos])));                   max_ =                       max(max_, dp[pos2][used + 1][max(a - 1, 0)][k - 1] +                                     max((a >= 1) * (ans[0][pos]), ans[1][pos]));                 }                 if (used + 2 <= p) {                   max_ = max(max_, dp[pos2][used + 2][k - 1][k - 1]);                 }                 dp[pos1][used][a][b] = max_;               }             }           }         }       }       printf( %d n , dp[0][0][0][0]);     }     return 0;   }   