#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF = 1e18;
int n,t,s;
int points[20005],pref[20005];
int tole[55][20005];
int dp[20005][55];
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n>>t>>s;
for(int i=1;i<=t;i++)
{
cin>>points[i];
pref[i] = pref[i-1] + points[i];
}
for(int i=1;i<=n;i++)
{
char ch;
int ult=0;
for(int j=1;j<=t;j++)
{
cin>>ch;
if(ch=='0')
ult=j;
tole[i][j] = ult;
}
}
for(int cnt=1;cnt<=s;cnt++)
dp[0][cnt]=INF;
for(int i=1;i<=t;i++)
{
vector<int> aux;
for(int j=1;j<=n;j++)
aux.push_back(tole[j][i]);
aux.push_back(0);
aux.push_back(i);
sort(aux.begin(),aux.end());
reverse(aux.begin(),aux.end());
dp[i][0] = INF;
for(int cnt=1;cnt<=s;cnt++)
{
dp[i][cnt] = INF;
for(int j=1;j<aux.size();j++)
{
if(aux[j]==aux[j-1])
continue;
//for(int u=aux[j];u<aux[j-1];u++) dp[i][cnt] = min(dp[i][cnt], dp[u][cnt-1] + (pref[i] - pref[u]) * (n - j + 1));
dp[i][cnt] = min(dp[i][cnt], dp[aux[j]][cnt-1] + (pref[i] - pref[aux[j]]) * (n - j + 1));
dp[i][cnt] = min(dp[i][cnt], dp[aux[j-1]-1][cnt-1] + (pref[i] - pref[aux[j-1]-1]) * (n - j + 1));
}
//cout<<i<<" "<<cnt<<" "<<dp[i][cnt]<<"\n";
}
}
for(int i=1;i<=s;i++)
cout<<dp[t][i]<<"\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |