#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxr = 103;
const int maxc = 12;
int dp[103][12][2048+123][22];
char mp[maxr][maxc];
const int mod = 10e9+7;
int main(){
freopen("c.in", "r", stdin);
int N, M, C, D;
while (~scanf("%d%d%d%d", &N, &M, &C, &D)){
memset (dp, 0, sizeof(dp));
for (int i=1; i<=N; ++i){
scanf("%s", mp+i);
}
int lim = 1<<(M+1);/// 0 ->
dp[0][M][0][0] = 1;
for (int i=1; i<=N; ++i){
for (int k=0; (k<<1)<lim; ++k){
for (int c=0; c<=D; ++c)
dp[i][0][k<<1][c] = dp[i-1][M][k][c];
}
for (int j=1; j<=M; ++j){
const int ma = 1<<j;
const int mb = 1<<(j-1);
for (int k=0; k<lim; ++k){
if(mp[i][j-1] == '1'){
if(!(k&ma) && !(k&mb)){
for (int c=0; c<D; ++c){/// 00 -> 00 1*1 placed
dp[i][j][k][c+1] += dp[i][j-1][k][c];
dp[i][j][k][c+1] %= mod;
}
for (int c=0; c<=D; ++c){/// 00 -> 01 or 10 non placed
dp[i][j][k|ma][c] += dp[i][j-1][k][c];
dp[i][j][k|ma][c] %= mod;
dp[i][j][k|mb][c] += dp[i][j-1][k][c];
dp[i][j][k|mb][c] %= mod;
}
}
if( (!(k&ma)) ^ (!(k&mb)) ) /// 01/10 -> 00 2*1 or 1*2 placed
for (int c=0; c<=D; ++c){
dp[i][j][k^(k&ma)^(k&mb)][c] += dp[i][j-1][k][c];
dp[i][j][k^(k&ma)^(k&mb)][c] %= mod;
}
/// 11 is invalid
}
else {
if(!(k&ma) && !(k&mb)) /// 00 -> 00 forbid to place
for (int c=0; c<=D; ++c){
dp[i][j][k][c] += dp[i][j-1][k][c];
dp[i][j][k][c] %= mod;
}
}
}
}
}
long long ans = 0;
for (int i=C; i<=D; ++i){
ans = (ans+dp[N][M][0][i])%mod;
}
printf("%lld\n", ans);
}
return 0;
}
2013南京 Onsite 代碼(未提交)
將近1年沒好好訓練,結果弄個4題第一名,將近1半比賽的時間都沒碰過pc^2 比賽的時候看的C,E,K, 都敲出來, 有機會交下, 我真是個逗逼,
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.