std

std 2022-07-05 17:43:31 16 返回题目

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring> 
using namespace std;
const int R=85;
const int J=100000000;
int n,m;
int a[R][R],f[R][R][5],result[5];
void init(int row) {
	memset(f,0,sizeof(f));
	for (int j=1; j<=n; j++) {
		f[j][j][1]=2*a[row][j];
	}
}
void mul(int tem[],int b,int e,int k) {
	int t=0;
	for (int i=1; i<=4; i++) {
		tem[i]=tem[i]+f[b][e][i]*k+t;
		t=tem[i]/J;
		tem[i]=tem[i]%J;
	}
}
void solve(int row) {
	int p,ii;
	int tmp1[5],tmp2[5];
	init(row);
	for (int k=1; k<=n-1; k++) {
		for (int i=1; i<=n-k; i++) {
			int j=i+k;
			memset(tmp1,0,sizeof(tmp1));
			tmp1[1]=f[i][i][1];
			mul(tmp1,i+1,j,2);
			memset(tmp2,0,sizeof(tmp2));
			tmp2[1]=f[j][j][1];
			mul(tmp2,i,j-1,2);
			for (p=4; p>=1; p--) {
				if (tmp1[p]!=tmp2[p]) { //注意不能是if (tmp1[p]>tmp2[p]) break;
					p=(tmp1[p]>tmp2[p]? 1:2);
					break;
				}
			}
			if (p==1) {
				for (ii=1; ii<=4; ii++) {
					f[i][j][ii]=tmp1[ii];
				}
			} else {
				for (ii=1; ii<=4; ii++) {
					f[i][j][ii]=tmp2[ii];
				}
			}
		}
	}
}
int main() {
	scanf("%d %d",&m,&n);
	for (int i=1; i<=m; i++) {
		for (int j=1; j<=n; j++) {
			scanf("%d", &a[i][j]);
		}
	}
	memset(result,0,sizeof(result));
	for (int i=1; i<=m; i++) {
		solve(i);
		mul(result,1,n,1);
	}
	int i=4,t;
	while (result[i]==0&&i>0) i--;//注意i>0
	printf("%d",result[i]);
	for (int j=i-1; j>=1; j--) {
		printf("%8.8d",result[j]);//位宽
	}
	return 0;
}
{{ vote && vote.total.up }}