首页 > 代码库 > 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 )
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。