【题面】
【题解】
QAQ感冒了精神状态好差这题补了好久 。
分组dp。
dp[i][j]保存第i天女神不高兴度为j时Casya的最短上线时间。dp1[k]保存当天女神在线k个小时且Casya也同时在线的Casya的最短上线时间。dp是我的痛,随便看看吧就...
【代码】
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int dp[205][205];
int dp1[205];
char s[205][205];
int main()
{
int t; scanf("%d",&t);
while(t--){
int n,m,k; scanf("%d%d%d",&n,&m,&k);
memset(dp,inf,sizeof(dp));
dp[0][0]=0;
for(int i=1;i<=n;i++){
scanf("%s",s[i]+1);
memset(dp1,inf,sizeof(dp1));
dp1[0]=0; dp1[1]=1;
vector <int> v; //存储女神在线的时间
for(int t=1;t<=m;t++){
if(s[i][t]=='1'){
v.push_back(t);
int l=v.size();
for(int j=1;j<l;j++){
dp1[j+1]=min(dp1[j+1],t-v[l-1-j]+1);
}
}
}
int l=v.size();
//分组背包
for(int j=0;j<=k;j++){ //女神不高兴度
for(int t=0;t<=l;t++){
if(j+l-t>k) continue; //女神不高兴度大于k时不考虑
dp[i][j+l-t]=min(dp[i][j+l-t],dp[i-1][j]+dp1[t]);
}
}
}
int ans=dp[n][k];
for(int j=0;j<=k;j++)
ans=min(ans,dp[n][j]);
printf("%d\n",ans);
}
return 0;
}