赞
踩
目录
样例输入
- 3
- 7 8 9
- 4 5 7
- 1 2 3
样例输出
16
毫无疑问,纯暴力超时了......
- #include <iostream>
- using namespace std;
- const int N=250010;
- int main()
- {
- int n,a[N],t[500],temp,maxi=0,sum;
- cin>>n;
- //输入
- for(int i=0;i<n;i++){
- temp=n*i;
- for(int j=0;j<n;j++)
- cin>>a[temp+j];
- }
- sum=0;
- for(int i=0;i<n;i++)
- sum+=a[i*n+i];
- if(sum>maxi)maxi=sum;
-
- for(int i=0;i<n-1;i++){
- //保存第一行
- for(int k=0;k<n;k++){
- t[k]=a[k];
- }
- //行循环移动
- for(int k=0;k<n;k++){
- for(int p=0;p<n-1;p++){
- a[p*n+k]=a[(p+1)*n+k];
- }
- }
- //最后一行等于第一行
- for(int k=0;k<n;k++)
- a[(n-1)*n+k]=t[k];
- sum=0;
- for(int i=0;i<n;i++)
- sum+=a[i*n+i];
- if(sum>maxi)maxi=sum;
- }
-
-
- //循环移动,第一行移到最后一行,N*N行移动就只有N种,列移动就N种
- for(int i=0;i<n;i++){
- //保存第一列
- for(int k=0;k<n;k++){
- t[k]=a[k*n];
- }
- //列循环移动
- for(int k=0;k<n;k++){
- for(int p=0;p<n-1;p++){
- a[k*n+p]=a[k*n+p+1];
- }
- }
- //最后一列等于第一列
- for(int k=0;k<n;k++)
- a[k*n+n-1]=t[k];
-
- //
- for(int i=0;i<n-1;i++){
- //保存第一行
- for(int k=0;k<n;k++){
- t[k]=a[k];
- }
- //行循环移动
- for(int k=0;k<n;k++){
- for(int p=0;p<n-1;p++){
- a[p*n+k]=a[(p+1)*n+k];
- }
- }
- //最后一行等于第一行
- for(int k=0;k<n;k++)
- a[(n-1)*n+k]=t[k];
- sum=0;
- for(int i=0;i<n;i++)
- sum+=a[i*n+i];
- if(sum>maxi)maxi=sum;
- }
- }
-
- cout<<maxi;
- return 0;
- }
由于是循环行or列,所以很多相对位置是固定的
看了图,有没有豁然开朗呢QvQ
这个我觉得是比较好理解的,实在看不懂草稿纸上模拟一下过程吧
- #include <iostream>
- using namespace std;
- const int N=250010;
- int main()
- {
- int n,a[N],maxi=0,sum,temp;
- cin>>n;
- //输入
- for(int i=0;i<n;i++){
- temp=n*i;
- for(int j=0;j<n;j++)
- cin>>a[temp+j];
- }
- //遍历
- for(int l=0;l<n;l++){
- sum=0;
- for(int r=0;r<n;r++){
- int line=(l+r)%n;
- int row=r;
- sum+=a[line*n+row];
- }
- if(sum>maxi)maxi=sum;
- }
- cout<<maxi;
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。