#include<bits/stdc++.h>
using namespace std;
const int M=
15,INF=
1555,N=
1694323;
int dp[N],val[M];
int hat,n,m,B[M],k,guess_num;
char str[M][M];
bool X[M],Y[M];
struct pos{
int x,y;}A[M];
int dfs(
int S,
int c,
int num){
if(~dp[S])
return dp[S];
int &ans=dp[S];ans=
0;
if(!c){
memset(X,
0,
sizeof(X));
memset(Y,
0,
sizeof(Y));
for(
int i=
0;i<hat;i++){
int nw=S/B[i]%
3;
int x=A[i].x,y=A[i].y;
if(nw!=
2)X[x]^=
1,Y[y]^=
1;
}
for(
int i=
0;i<n;i++)
if(X[i])
return ans=INF;
for(
int i=
0;i<m;i++)
if(Y[i])
return ans=INF;
return ans;
}
if(!num){
for(
int i=
0;i<hat;i++){
if(!(S/B[i]%
3)&&!dfs(S+B[i]*
2,c-
1,
0))
return ans=
0;
}
return ans=INF;
}
for(
int i=
0;i<hat;i++){
int nw=S/B[i]%
3;
if(!nw){
int get_it=dfs(S+B[i]*
2,c-
1,num-
1)+
1;
int not_get_it=dfs(S+B[i],c,num-
1);
ans=max(ans,min(get_it,not_get_it));
}
}
return ans;
}
int main(){
memset(dp,-
1,
sizeof(dp));
scanf(
"%d %d %d %d",&n,&m,&k,&guess_num);
for(
int i=
0;i<n;i++)
scanf(
"%s",str[i]);
for(
int i=
0;i<n;i++)
for(
int j=
0;j<m;j++)
if(str[i][j]==
'H')A[hat++]=(pos){i,j};
for(
int i=
0;i<k;i++)
scanf(
"%d",val+i);
B[
0]=
1;
for(
int i=
1;i<M;i++)B[i]=B[i-
1]*
3;
sort(val,val+k);
int mx=dfs(
0,k,guess_num);
if(hat<k||mx==INF){
puts(
"-1");
return 0;}
int ans=
0;
for(
int i=
0;i<mx;i++)ans+=val[i];
printf(
"%d",ans);
}
转载请注明原文地址: https://ju.6miu.com/read-669461.html