1. 程式人生 > >T7315 yyy矩陣折疊(長)

T7315 yyy矩陣折疊(長)

bool -1 mat inline algo math () == https

題目背景

全場基本暴零

題目描述

技術分享

輸入輸出格式

輸入格式:

如圖

輸出格式:

如圖

輸入輸出樣例

輸入樣例#1:
2 2
1 -2
3 -4
輸出樣例#1:
4
輸入樣例#2:
2 5
1 -2 -3 4 -5
6 -7 -8 9 -10
輸出樣例#2:
20

說明

如圖

DFS行,狀壓DP列

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5
#include<algorithm> 6 #include<queue> 7 #include<stack> 8 #include<cstdlib> 9 using namespace std; 10 const int maxn=0x7fffff; 11 inline void read(int &n) 12 { 13 char c=+;int x=0;bool flag=0; 14 while(c<0||c>9){c=getchar();if(c==-)flag=1;}
15 while(c>=0&&c<=9) 16 x=(x<<1)+(x<<3)+c-48,c=getchar(); 17 flag==1?n=-x:n=x; 18 } 19 int n,m; 20 int a[99][501]; 21 int ans=-maxn; 22 int cur[501]; 23 int pos2(int x) 24 { 25 return (1<<x); 26 } 27 int dp(int zt) 28 { 29 memset(cur,0
,sizeof(cur)); 30 int ou,ji; 31 for(int i=1;i<=n;i++) 32 if(zt&pos2(i)) 33 for(int j=1;j<=m;j++) 34 cur[j]+=a[i][j]; 35 bool flag=1; 36 for(int i=1;i<=m;i++) 37 if(cur[i]>0) 38 { 39 flag=0; 40 break; 41 } 42 if(flag) 43 return -maxn; 44 ou=0;ji=0; 45 for(int i=1;i<=m;i++) 46 { 47 if(i&1) 48 { 49 int x=cur[i]+ou; 50 ji=max(ji,x); 51 } 52 else 53 { 54 int x=cur[i]+ji; 55 ou=max(ou,x); 56 } 57 } 58 return max(ou,ji); 59 } 60 void dfs(int pos,int last,int zt) 61 { 62 if(pos==n+1) 63 { 64 ans=max(ans,dp(zt)); 65 return ; 66 } 67 68 if(last==-1||(pos-last)&1) 69 dfs(pos+1,pos,zt|pos2(pos)); 70 dfs(pos+1,last,zt); 71 } 72 int main() 73 { 74 read(n);read(m); 75 for(int i=1;i<=n;i++) 76 for(int j=1;j<=m;j++) 77 { 78 read(a[i][j]); 79 ans=max(ans,a[i][j]); 80 } 81 if(ans<0) 82 cout<<ans; 83 else 84 { 85 dfs(1,-1,0); 86 printf("%d",ans); 87 } 88 return 0; 89 }

T7315 yyy矩陣折疊(長)