简单dp
#include <stdio.h> #include <cstring> #include <iostream> #include <map> using namespace std; typedef unsigned long long ull; const int N = 105; int n, m, a[N]; int s[N][N], dp[2][N]; void pt(int x ){ for(int i = 1; i <= m; i++)printf("%d ", dp[x][i]); puts(""); } int solve(){ int cur = 0; if(a[1] < 0) memset(dp[cur], 0, sizeof dp[cur]); else { memset(dp[cur], -1, sizeof dp[cur]); dp[cur][a[1]] = 0; } for(int i = 2; i <= n; i++) { cur ^= 1; memset(dp[cur], -1, sizeof dp[cur]); if(a[i]>0) { for(int j = 1; j <= m; j++) if(dp[cur^1][j] != -1) dp[cur][a[i]] = max(dp[cur][a[i]], dp[cur^1][j] + s[j][a[i]]); } else { for(int j = 1; j <= m; j++) if(dp[cur^1][j]!=-1) for(int k = 1; k <= m; k++) dp[cur][k] = max(dp[cur][k], dp[cur^1][j]+s[j][k]); } // cout<<i<<":"; pt(cur); } int ans = 0; for(int i = 1; i <= m; i++) ans = max(ans, dp[cur][i]); return ans; } void input(){ cin>>n >> m; for(int i = 1; i <= m; i++) for(int j = 1; j <= m; j++) scanf("%d", &s[i][j]); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); } int main(){ int T; cin>>T; while(T--){ input(); cout<<solve()<<endl; } return 0; } /* 9 3 3 1 1 5 5 1 100 1 5 1 -1 -1 -1 */