NC231411. 矩阵矩阵矩
描述
输入描述
第一行两个整数分别为矩阵的行数和列数。
接下来行,每行
个整数为
。
输出描述
输出一行,一个整数,为答案。
示例1
输入:
8 8 4 4 0 1 0 1 1 1 1 2 1 0 8 1 4 1 1 1 2 0 1 1 1 4 0 1 1 0 1 0 4 0 1 0 0 1 1 1 0 1 1 0 1 4 4 1 8 0 1 1 8 4 4 0 0 0 4 4 2 8 1 0 0 1
输出:
32768
C++ 解法, 执行用时: 1019ms, 内存消耗: 243068K, 提交时间: 2021-12-18 20:46:07
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> using namespace std; const int mod=998244353; int maxn=1005; int maxm=30000005; int inf=1e8; int n,m; long long a[30000005]; long long b[1005][1005]; int main() { a[0]=1; for(int i=1;i<=maxm;i++) a[i]=(a[i-1]*2)%mod; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { int x; scanf("%d",&x); if(x==0) b[i][j]=-inf; else while(x!=1) x/=2,b[i][j]++; b[i][j]+=b[i-1][j]; } long long ans=0; for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) { long long now=0; for(int k=1;k<=m;k++) { now=max(b[j][k]-b[i-1][k],now+b[j][k]-b[i-1][k]); ans=max(ans,now); } } if(ans<=0) printf("0"); else printf("%lld",a[ans]); return 0; }