这题用直接枚举是超时的,必须要用搜索来搜索出所有可能的状态,然后再进行枚举
这是较慢的做法
/*方格取数,相邻格子的数不可取,问最多取到的和是什么 有点类似炮兵布阵,先打出所有可能的状态,然后dp[i][j]表示前i行在状态v[j]下的最大和 dp[i][j]由dp[i-1][t]推出,v[t]是和v[j]兼容的状态 */#includeusing namespace std;int mp[25][25],n,dp[21][200000];int v[200000],tot;vector sum[25];//sum[i][j]表示第i行在状态v[j]下的和 inline int legal(int j){ if( j&(j<<1) )return false; return true;}inline int cal(int s,int k){ //状态s对应的数值 int res=0; for(int i=1;i<=n;i++) if( s&(1<<(i-1)) )res+=mp[k][n-i+1]; return res;}void init(){ tot=0; for(int j=0;j<=(1< >n){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)cin>>mp[i][j]; init(); memset(dp,0,sizeof dp); for(int i=0;i