제출 #1357221

#제출 시각아이디문제언어결과실행 시간메모리
1357221Jawad_Akbar_JJ조교 (CEOI16_popeala)C++20
100 / 100
196 ms49092 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
#define int long long
const int N = 1<<15;
int dp[N][55], Mn[N][55];
int num[N], sc[N];
vector<pair<int, int>> vec[N];
vector<int> en[N];

signed main(){
	int n, t, S;
	cin>>n>>t>>S;

	for (int i=1;i<=t;i++)
		cin>>sc[i], sc[i] += sc[i-1];

	for (int i=0;i<n;i++){
		string s;
		cin>>s;
		for (int j=t-1, l = t;j+1;j--){
			if (s[j] == '0')
				l = j;
			en[j].push_back(l);
		}
	}

	for (int k=0;k<=S;k++){
		for (int i=0;i<=t;i++)
			dp[i][k] = 2e9 + 7;
	}

	for (int i=0;i<t;i++){
		sort(begin(en[i]), end(en[i]));

		for (int j=0, k = 0;j < n;j = k){
			while (k < n and en[i][k] == en[i][j])
				k++;
			vec[i].push_back({en[i][j], k - j});
		}
		vec[i].push_back({t+1, 0});
	}

	dp[0][0] = 0;
	for (int k=1;k<=S;k++){
		for (int i=0;i<=t;i++)
			for (int j=0;j<=n;j++)
				Mn[i][j] = 2e9 + 7;
		
		for (int i=0;i<=t;i++){
			for (int j=0;j<=n;j++)
				dp[i][k] = min(dp[i][k], Mn[i][j] + sc[i] * j);

			int cr = n, L = i;
			for (auto [p, c] : vec[i]){
				Mn[L][cr] = min(Mn[L][cr], dp[i][k-1] - cr * sc[i]);
				L = p+1, cr -= c;
			}

			for (int j=0;j<=n;j++)
				Mn[i+1][j] = min(Mn[i+1][j], Mn[i][j]);
		}
		cout<<dp[t][k]<<endl;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...