제출 #1357294

#제출 시각아이디문제언어결과실행 시간메모리
1357294MuhammadSaram조교 (CEOI16_popeala)C++20
0 / 100
289 ms3028 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int N = 20001, M = 50, inf = 2e9;

signed main()
{
	int n,m,s;
	cin>>m>>n>>s;
	int a[n], b[m][n], pre[n+1]={};
	for (int i=0;i<n;i++)
		cin>>a[i], pre[i+1]=pre[i]+a[i];
	for (int i=0;i<m;i++)
	{
		string s;
		cin>>s;
		for (int j=0;j<n;j++)
			b[i][j]=s[j]-'0' 	;
	}
	int dp[n+1][s+1]={}, prem[n+1][s+1];
	for (int i=0;i<=n;i++) 
		for (int j=0;j<=s;j++) dp[i][j]=prem[i][j]=inf;
	dp[0][0]=prem[0][0]=0;
	for (int x=1;x<=s;x++)
	{
		int ls[m]={};
		multiset<int> se={0};
		for (int i=0;i<m;i++) ls[i]=-1;
		for (int i=0;i<n;i++)
		{
			for (int j=0;j<m;j++)
				if (!b[j][i])
				{
					if (~ls[j]) se.erase(se.find(ls[j]));
					ls[j]=i, se.insert(ls[j]);
				}
			int op=se.size();
			for (int o:se)
			{
				int su=0, mn=i;
				for (int j=0;j<m;j++) su+=(pre[i+1]-pre[o])*(o>ls[j]);
				dp[i+1][x]=min(dp[i+1][x],su+dp[o][x-1]);
				if (o==i) continue;
				su=0;
				for (int j=0;j<m;j++) su+=(pre[i+1]-pre[o+1])*(o+1>ls[j]), mn=min(mn,ls[j]);
				dp[i+1][x]=min(dp[i+1][x],su+dp[o][x-1]);
			}
			if (se.size()==m+1)
				dp[i+1][x]=min(dp[i+1][x],prem[*se.begin()][x-1]);
			prem[i+1][x]=min(prem[i][x],dp[i+1][x]);
		}
		cout<<dp[n][x]<<endl;
	}

	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...