Hatsune Miku
code
#include <bits/stdc++.h>
using namespace std;
int sco[ 110 ] [ 110 ] ;
int idx[ 110 ] ;
int dp[ 110 ] [ 110 ] ;
void solve ( ) {
int o; cin >> o;
while ( o -- ) {
int n, m;
cin >> n >> m;
for ( int i = 1 ; i <= m; ++ i) {
for ( int j = 1 ; j <= m; ++ j) {
cin >> sco[ i] [ j] ;
}
}
for ( int i = 1 ; i <= n; ++ i) cin >> idx[ i] ;
memset ( dp, 0 , sizeof dp) ;
for ( int i = 2 ; i <= n; ++ i) {
if ( idx[ i - 1 ] < 0 ) {
if ( idx[ i] < 0 ) {
for ( int j = 1 ; j <= m; ++ j) {
for ( int k = 1 ; k <= m; ++ k) {
dp[ i] [ j] = max ( dp[ i] [ j] , dp[ i - 1 ] [ k] + sco[ k] [ j] ) ;
}
}
} else {
for ( int j = 1 ; j <= m; ++ j) {
dp[ i] [ idx[ i] ] = max ( dp[ i] [ idx[ i] ] , dp[ i - 1 ] [ j] + sco[ j] [ idx[ i] ] ) ;
}
}
} else {
if ( idx[ i] < 0 ) {
for ( int j = 1 ; j <= m; ++ j) {
dp[ i] [ j] = max ( dp[ i] [ j] , dp[ i - 1 ] [ idx[ i - 1 ] ] + sco[ idx[ i - 1 ] ] [ j] ) ;
}
} else {
dp[ i] [ idx[ i] ] = dp[ i - 1 ] [ idx[ i - 1 ] ] + sco[ idx[ i - 1 ] ] [ idx[ i] ] ;
}
}
}
int maxx = 0 ;
for ( int i = 1 ; i <= m; ++ i) {
maxx = max ( maxx, dp[ n] [ i] ) ;
}
cout << maxx << endl;
}
}
signed main ( ) {
ios_base:: sync_with_stdio ( false ) ;
cin. tie ( 0 ) ;
cout. tie ( 0 ) ;
#ifdef ACM_LOCAL
freopen ( "input" , "r" , stdin ) ;
freopen ( "output" , "w" , stdout ) ;
#endif
solve ( ) ;
return 0 ;
}