#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][2];
int dp_coef[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 i=1;i<=t;i++)
dp[i][0] = INF;
for(int cnt=1;cnt<=s;cnt++)
{
for(int coef=0;coef<=n;coef++)
dp_coef[0][coef] = dp[0][1-cnt%2] - pref[0]*coef;
for(int i=1;i<=t;i++)
for(int coef=0;coef<=n;coef++)
dp_coef[i][coef] = min(dp_coef[i-1][coef], dp[i][1-cnt%2] - pref[i]*coef);
dp[0][cnt%2] = 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][cnt%2] = INF;
for(int j=1;j<aux.size();j++)
{
if(aux[j]==aux[j-1])
continue;
if(aux[j-1]-1>=0) dp[i][cnt%2] = min(dp[i][cnt%2], dp_coef[aux[j-1]-1][n-j+1] + pref[i] * (n - j + 1));
}
}
cout<<dp[t][cnt%2]<<"\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... |