三题,排名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;
}
View Code

相关文章: