2013南京 Onsite 代碼(未提交)

將近1年沒好好訓練,結果弄個4題第一名,將近1半比賽的時間都沒碰過pc^2 比賽的時候看的C,E,K, 都敲出來, 有機會交下, 我真是個逗逼, 
#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章