Submission #963793

#TimeUsernameProblemLanguageResultExecution timeMemory
963793LucaIliePopeala (CEOI16_popeala)C++17
100 / 100
1308 ms24144 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], add[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++ ) { vector<int> pos; pos.push_back( i ); for ( int j = 0; j < n; j++ ) { if ( last0[j][i] != 0 ) { pos.push_back( last0[j][i] ); add[last0[j][i]]++; } } sort( pos.begin(), pos.end() ); pos.resize( unique( pos.begin(), pos.end() ) - pos.begin() ); reverse( pos.begin(), pos.end() ); int c = n; for ( int j: pos ) { c -= add[j]; add[j] = 0; dp[i][k] = min( dp[i][k], minFunc[j - 1][c] + (long long)c * points[i] ); } } } 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...