#include #include int K,L; struct { int min; int ktory; } best[91][91]; char klawisze[91]; char litery[91]; int freq[91]; int stos[91]; int koszt( int a, int b ) { int suma = 0; for( int start =a; start<=b; start++ ) { suma += freq[ start ] * ( start - a + 1 ); } return suma; } void wylicz_kolejny( int ktory ) { for( int i=1; i<=L; i++ ) { int min = INT_MAX; int save; int j; for( j=1; j<=i; j++ ) { int d = koszt( i-j+1, i ) + best[ktory-1][i-j].min; if( d > min && ktory != 1) break; min = d; save = j; } best[ ktory ][ i].min = min; best[ktory][i].ktory = save; } } int main() { int T; cin >> T; for( int i=0; i> K >> L; cout << "Keypad #"<> klawisze[j]; for( int j=1; j<=L; j++ ) cin >> litery[j]; for( int j=1; j<=L; j++ ) cin >> freq[j]; for( int j=1; j<=L; j++ ) { best[1][j].min = koszt( 1, j ); best[1][j].ktory = j; } for( int j=2; j<=K; j++ ) wylicz_kolejny( j ); int jeszcze = L; for( int j=K; j>=1; j-- ) { int ile = best[ j ][ jeszcze ].ktory; jeszcze -= ile; stos[ j ] = ile; } int akt = 0; for( int j=1; j<=K; j++ ) { cout << klawisze[j]<< ": "; for( int w=1; w<=stos[ j ]; w++ ) cout << (char)( litery[ akt++ ] ) ; cout << endl; } cout << endl; } }