三题,排名98,铜尾……
说实话,这样下去真的很害怕,感觉每次都是铜尾阿= = 等正式比赛时一点失误不就tm又铁了嘛。。。。
刚开始很多人过I题,zr看了下直接写的。1A
然后部分人过了E,我看了下,水dp,随便敲了下,1A
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 105; int a[N]; int s[N][N]; int dp[N][N]; int main() { //freopen("in.txt", "r", stdin); int T; scanf("%d", &T); while (T--) { int n, m; scanf("%d%d", &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); } memset(dp, -1, sizeof dp); if (a[1] != -1) dp[1][a[1]] = 0; else { for (int j = 1; j <= m; ++j) { dp[1][j] = 0; } } for (int i = 2; i <= n; ++i) { if (a[i] != -1) { for (int k = 1; k <= m; ++k) { if (dp[i-1][k] < 0) continue; dp[i][a[i]] = max(dp[i][a[i]], dp[i-1][k] + s[k][a[i]]); } continue; } for (int j = 1; j <= m; ++j) { for (int k = 1; k <= m; ++k) { if (dp[i-1][k] < 0) continue; dp[i][j] = max(dp[i][j], dp[i-1][k] + s[k][j]); } } } int ans = 0; for (int j = 1; j <= m; ++j) { ans = max(ans, dp[n][j]); } printf("%d\n", ans); } return 0; }