首页 > 代码库 > POJ 3254 Corn Field ( 状态压缩DP )

POJ 3254 Corn Field ( 状态压缩DP )

简单题,边界处理注意。可以优化,就不精益求精了。


#include <iostream>
#include <cstring>
#include <vector>
#include <fstream>
using namespace std;
#define MOD 100000000
int field[20];
int DP[20][1200];

int main(){

    int N, M;
    cin >> N >> M;

    memset( field, 0, sizeof( field ) );

    for( int n = 0; n < N; ++n ){
        for( int m = 0; m < M; ++m ){
            int nm;
            cin >> nm;
            field[n] = ( field[n] << 1 ) | nm;
        }
    }

    const int bits = 1 << M;
    vector< int > useful_bits;

    for( int b = 0; b < bits; ++b ){
        if( !( b & ( b << 1 ) ) ){                
            useful_bits.push_back( b );        
            if( !( b & ~field[0] ) ){
                DP[0][b] = 1;
            }
        }
    }

    for( int n = 1; n < N; ++n ){
        for( vector< int >::iterator line_iter = useful_bits.begin();
             line_iter != useful_bits.end();
             ++line_iter ){

            if( !( *line_iter & ( ~field[n] ) ) ){
                for( vector< int >::iterator pre_line_iter = useful_bits.begin();
                     pre_line_iter != useful_bits.end();
                     ++pre_line_iter ){

                    if( !( *pre_line_iter & *line_iter ) &&
                        !( *pre_line_iter & ( ~field[n - 1] ) ) ){
                        DP[n][*line_iter] = ( DP[n][*line_iter] + DP[n - 1][*pre_line_iter] ) % MOD;
                    }
                }
            }
        }
    }

    int res = 0;
    for( int b = 0; b < bits; ++b ){
        res = ( res + DP[N - 1][b] ) % MOD;
    }
    cout << res << endl;

    return 0;
}


POJ 3254 Corn Field ( 状态压缩DP )