Submission #963787

#TimeUsernameProblemLanguageResultExecution timeMemory
963787LucaIliePopeala (CEOI16_popeala)C++17
26 / 100
2062 ms22548 KiB
#include <bits/stdc++.h> using namespace std; const int MAX_N = 50; const int MAX_T = 50000; const int MAX_S = 50; const long long INF = 1e15; bool solved[MAX_N][MAX_T + 1]; int points[MAX_T + 1], last0[MAX_N][MAX_T + 1]; long long dp[MAX_T + 1][MAX_S + 1], minFunc[MAX_T + 1][MAX_N + 1]; int main() { int n, t, s; cin >> n >> t >> s; for ( int i = 1; i <= t; i++ ) { cin >> points[i]; points[i] += points[i - 1]; } for ( int j = 0; j < n; j++ ) { for ( int i = 1; i <= t; i++ ) { char ch; cin >> ch; solved[j][i] = ch - '0'; last0[j][i] = (!solved[j][i] ? i : last0[j][i - 1]); } } for ( int i = 0; i <= t; i++ ) { for ( int k = 0; k <= s; k++ ) dp[i][k] = INF; } dp[0][0] = 0; for ( int k = 1; k <= s; k++ ) { for ( int i = 0; i <= t; i++ ) { for ( int c = 0; c <= n; c++ ) minFunc[i][c] = min( (i == 0 ? INF : minFunc[i - 1][c]), dp[i][k - 1] - c * points[i] ); } for ( int i = 1; i <= t; i++ ) { map<int, int> pos; pos[i] = 0; for ( int j = 0; j < n; j++ ) pos[last0[j][i]]++; pos.erase( 0 ); int c = n; for ( auto p = pos.rbegin(); p != pos.rend(); p++ ) { int j = p->first; c -= p->second; //printf( "ba %d %d %d %d\n", i, j, c, minFunc[j - 1][c] ); dp[i][k] = min( dp[i][k], minFunc[j - 1][c] + (long long)c * points[i] ); } // cout << dp[i][k] << " "; } //cout << "\n"; } for ( int k = 1; k <= s; k++ ) cout << dp[t][k] << "\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...