#include int fqs[100]; int Ss[100][100]; int Qs[100][100], K, L; #define INFTY -1 int wsum(int *ary, int N) { int k, sum =0; for(k = 0; k < N; ++k) sum += ary[k]*(k+1); return sum; } void init() { int i; for(i = 0; i < 100; i++) for(int j = 0; j < 100; j++) Ss[i][j] = Qs[i][j] = INFTY; for(i = 0; i < L; ++i) { Ss[K-1][i] = wsum(fqs+i,L-i); Qs[K-1][i] = L-i; } } int rec(int k, int l) { int nl; if(Ss[k][l] != INFTY) return Ss[k][l]; // if(k >= K) // cout << "NIKAAA!" << endl; int min = INFTY, suma = 0, tmin; if(l == L-1) return fqs[l]; for(nl = 1; nl <= L-l - (K-k) + 1; ++nl) { suma += nl*fqs[l+nl-1]; tmin = suma + rec(k+1, l+nl); if(tmin <= min || min == INFTY) { min = tmin; Qs[k][l] = nl; Ss[k][l] = tmin; } } return Ss[k][l]; } int main() { int nCase, NCase, i, j; char keys[100], letters[100]; cin >> NCase; nCase = 1; while(nCase <= NCase) { cin >> K >> L; for(i = 0; i < K; ++i) cin >> keys[i]; for(i = 0; i < L; ++i) cin >> letters[i]; for(i = 0; i < L; ++i) cin >> fqs[i]; init(); rec(0,0); cout << "Keypad #" << nCase << ':' << endl; int ckeys = 0; for(i = 0; i < K; ++i) { cout << keys[i] << ": "; for(j = ckeys; j < ckeys + Qs[i][ckeys]; ++j) cout << letters[j]; cout << endl; ckeys += Qs[i][ckeys]; } cout << endl; ++nCase; } }