hdu 4804 插头DP

来源:互联网 发布:c语言入门什么书好 编辑:程序博客网 时间:2024/04/28 23:39

和上一篇很像

AC代码如下:

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const long long MOD = 1e9 + 7;int N, M, C, D;long long dp[2][21][1<<11];char str[110][15];int main(){    while( scanf( "%d%d%d%d", &N, &M, &C, &D ) != EOF ){        for( int i = 0; i < N; i++ ){            scanf( "%s", str[i] );        }        int now, pre;        now = 0;    pre = 1;        memset( dp, 0, sizeof( dp ) );        dp[now][0][(1<<M)-1] = 1;        for( int i = 0; i < N; i++ ){            for( int j = 0; j < M; j++ ){                swap( now, pre );                memset( dp[now], 0, sizeof( dp[now] ) );                for( int k = 0; k <= D; k++ ){                    for( int s = 0; s < ( 1 << M ); s++ ){                        if( str[i][j] == '0' ){                            if( s & ( 1 << j ) ){                                dp[now][k][s] = ( dp[pre][k][s] + dp[now][k][s] ) % MOD;                            }                        }else{                            if( j && !( s & ( 1 << ( j - 1 ) ) ) && ( s & ( 1 << j ) ) ){                                dp[now][k][s|(1<<(j-1))] = ( dp[now][k][s|(1<<(j-1))] + dp[pre][k][s] ) % MOD;                            }                            dp[now][k][s^(1<<j)] = ( dp[now][k][s^(1<<j)] + dp[pre][k][s] ) % MOD;                            if( k > 0 && ( s & ( 1 << j ) ) ){                                dp[now][k][s|(1<<j)] = ( dp[now][k][s|(1<<j)] + dp[pre][k-1][s] ) % MOD;                            }                        }                    }                }            }        }        long long ans = 0;        for( int i = C; i <= D; i++ ){            ans = ( ans + dp[now][i][(1<<M)-1] ) % MOD;        }        cout << ans << endl;    }    return 0;}


0 0
原创粉丝点击