/*
dp+ state compression and artillery positions are similar
*/
#include <stdio.h> #include <string.h> #define MAX (A, b) a>b?a:bint dp[25][20000],s[20000],len,map[25][ 25],n;int check (int m) {if (m& (m<<1)) return 0; return 1;} void Inint () {len=0; for (int i=0;i< (1<<n); i++) {if (check (i)) s[len++]=i; }}int Count (int id,int m) {int d=n-1,sum=0; while (m>0) {if (m&1) sum+=map[id][d]; d--; m>>=1; } return sum;} int main () {while (scanf ("%d", &n)!=eof) {if (n==0) {printf ("0\n"); Continue } memset (Dp,0,sizeof (DP)); memset (map,0,sizeof (MAP)); for (int i=0;i<n;i++) for (int j=0;j<n;j++) scanf ("%d", &map[i][j]); Inint (); for (int i=0;i<len;i++) Dp[0][i]=count (0,s[i]); for (int r=1;r<n;r++) {for (Int. i=0;i<len;i++) for (int j=0;j<len;j++) IF ((S[i]&s[j]) ==0) Dp[r][i]=max (Dp[r][i],dp[r-1][j]+count (r,s[i])); } int ans=0; for (int i=0;i<len;i++) if (Dp[n-1][i]>ans) ans=dp[n-1][i]; printf ("%d\n", ans); } return 0;}
HDU 1565 squares (1)