T7315 yyy矩阵折叠(长)

2018-06-17 22:12:47来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

题目背景

全场基本暴零

题目描述

输入输出格式

输入格式:

 

如图

 

输出格式:

 

如图

 

输入输出样例

输入样例#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 }

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:分析A + B Problem II

下一篇:POJ 1655 Balancing Act(树的重心)