Submission #531762

#TimeUsernameProblemLanguageResultExecution timeMemory
531762KoDPopeala (CEOI16_popeala)C++17
100 / 100
406 ms6548 KiB
#include <bits/stdc++.h> using std::vector; using std::array; using std::pair; using std::tuple; constexpr int inf = std::numeric_limits<int>::max(); int main() { int N, T, S; std::cin >> N >> T >> S; vector<int> sum(T + 1); for (int i = 0; i < T; ++i) { std::cin >> sum[i + 1]; sum[i + 1] += sum[i]; } vector fail(T + 1, vector(N + 1, 0)); for (int i = 0; i < N; ++i) { for (int j = 0; j < T; ++j) { char c; std::cin >> c; fail[j + 1][i] = c == '0' ? j + 1 : fail[j][i]; } } for (int i = 0; i <= T; ++i) { fail[i][N] = i; std::sort(fail[i].begin(), fail[i].end()); } vector<int> dp(T + 1, inf); dp[0] = 0; for (int s = 1; s <= S; ++s) { vector<int> next(T + 1, inf), memo(N + 1, inf); for (int i = 1; i <= T; ++i) { for (int j = 0; j <= N; ++j) { for (int k = fail[i - 1][j]; k < fail[i][j]; ++k) { if (dp[k] != inf) { memo[j] = std::min(memo[j], dp[k] - sum[k] * j); } } if (memo[j] != inf) { next[i] = std::min(next[i], memo[j] + sum[i] * j); } } } dp = std::move(next); std::cout << dp[T] << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...