hdu 1565 状态压缩DP

来源:互联网 发布:温泽三坐标编程视频 编辑:程序博客网 时间:2024/06/06 06:47

和点击打开链接这题很像,跑了2.8s,不知道那些0ms的怎么跑出来的,●rz

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int dp[2][1<<20], prestatu;int num[22][22], N;int now, nowi;void DFS( int statu, int pos, int sum ){    if( pos > N ){        return;    }    dp[now][statu] = max( dp[now][statu], sum );    DFS( statu, pos + 1, sum );    int flag = 1;    if( pos > 1 ){        if( statu & ( 1 << ( pos - 2 ) ) ){            flag = 0;        }    }    if( prestatu & ( 1 << ( pos - 1 ) ) ){        flag = 0;    }    if( flag  ){        dp[now][statu|(1<<(pos-1))] = max( dp[now][statu|(1<<(pos-1))], sum + num[nowi][pos] );        DFS( statu|(1<<(pos-1)), pos + 1, sum + num[nowi][pos] );    }}int main(){    while( scanf( "%d", &N ) != EOF ){        memset( dp, -1, sizeof( dp ) );        for( int i = 1; i <= N; i++ ){            for( int j = 1; j <= N; j++ ){                scanf( "%d", &num[i][j] );            }        }        dp[0][0] = 0;        now = 1;        for( int i = 1; i <= N; i++ ){            memset( dp[now], -1, ( 1 << 20 ) * sizeof( int ) );            nowi = i;            for( int j = 0; j < ( 1 << N ); j++ ){                if( dp[now^1][j] != -1 ){                    prestatu = j;                    DFS( 0, 1, dp[now^1][j] );                }            }            now ^= 1;        }        int ans = 0;        for( int i = 0; i < ( 1 << N ); i++ ){            ans = max( ans, dp[now^1][i] );        }        cout << ans << endl;    }    return 0;}


0 0
原创粉丝点击