HDU 1565 方格取数(1)

来源:互联网 发布:燃烧热数据 编辑:程序博客网 时间:2024/06/08 19:03

数组不可以直接开,剪枝之后求算一下所有满足题目条件的状态数目,然后再开数组,30000足够。

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")#include <algorithm>#include <bitset>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <map>#include <queue>#include <set>#include <stack>#include <string>#include <cctype>#include <fstream>#define INF 0x3f3f3f3f#define EPS 1e-6#define TEST cout<<"stop here"<<endlusing namespace std;typedef long long ll;const ll mod = 1e9 + 7;const int N = 25;const int MAXN = 30000;int maze[N][N],st[MAXN],dp[N][MAXN];int n,tot = 0;void init(int m){    tot = 0;    for(int i=0;i< (1<<m);i++){        if( !(i&(i<<1)) ){            st[tot++] = i;        }    }    //cout<<tot<<endl;    //计算大概需要开的数组大小,1<<21肯定不行的}void Fun(int i,int j){    for(int k=1;k<=n;k++){        if(st[j] & (1<<(k-1)) )            dp[i][j] += maze[i][k];    }}int main(){    std::ios::sync_with_stdio(false);    std::cin.tie(0);    while(cin>>n){        memset(maze,0,sizeof(maze));        memset(dp,0,sizeof(dp));        init(n);        for(int i=1;i<=n;i++){            for(int j=1;j<=n;j++){                cin>> maze[i][j];            }        }        for(int i=1;i<=n;i++){            for(int j=0;j<tot;j++){                Fun(i,j);                int maxx = 0;                for(int k=0;k<tot;k++){                    if( !(st[j]&st[k]) ){                        maxx = max(maxx,dp[i-1][k]);//cout<<dp[i][j]<<endl;                    }                }                dp[i][j] += maxx;            }        }        int ans = 0;        for(int j=0;j<tot;j++){            ans = max(ans,dp[n][j]);        }        cout<< ans <<endl;    }    return 0;}