蒟蒻在线求解

Sarah 2020-06-14 10:32:45 2020-06-14 10:33:59 31 返回题目

为什么是60分,我在洛谷中一样的做法就是满分? #include

#include

#include

#include

using namespace std;

const int maxn=60;

int a[maxn][maxn];

int F[2*maxn][maxn][maxn];

int main()

{

int m,n;

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(F,-1,sizeof(F));

F[2][1][1]=0;

for(int k=3;k<m+n;k++)

for(int i=1;i<n;i++)

  for(int j=i+1;j<=n;j++)

  {

    int s=F[k][i][j];

    if(F[k-1][i][j]>s)s=F[k-1][i][j];

    if(F[k-1][i-1][j]>s)s=F[k-1][i-1][j];

    if(F[k-1][i][j-1]>s)s=F[k-1][i][j-1];

    if(F[k-1][i-1][j-1]>s)s=F[k-1][i-1][j-1];

    if(s==-1)continue;

    F[k][i][j]=s+a[k-i][i]+a[k-j][j];

  }

printf("%d",F[m+n-1][n-1][n]);

return 0; }

{{ vote && vote.total.up }}

共 3 条回复

x-hechengye
#include <iostream>
#include <algorithm>

using namespace std;

int f[52][52][52][52];
int a[52][52]; 

int main()
{
    ios::sync_with_stdio(false);
    int n,m;
    int t,t2;
    cin >> m >> n;
    for (int i = 1; i <= m; ++i)
     for (int j = 1; j <= n; ++j)
      cin >> a[i][j];
    for (int i = 1; i <= m; ++i)
    {
        for (int j = 1; j <= n; ++j)
        {
            for (int k = 1; k <= m; ++k)
            {
                for (int l = 1; l <= n; ++l)
                {
                    t = max(f[i][j - 1][k - 1][l],f[i - 1][j][k][l - 1]);
                    t2 = max(f[i - 1][j][k - 1][l],f[i][j - 1][k][l - 1]);
                    f[i][j][k][l] = max(t,t2) + a[i][j] + a[k][l];
                    if (i == k && j == l)
                     f[i][j][k][l] -= a[i][j];
                }
            }
        }
    }
    cout << f[m][n][m][n] << endl;
    return 0;
}
zhaocong

你没有加 continue 的条件

完整代码:

#include<bits/stdc++.h>

using namespace std;

int f[610][310][310],n,m;

int a[1010][1010];

int maxn(int x1,int x2,int x3,int x4){return max(max(max(x1,x2),x3),x4);}

int main(){

scanf("%d%d",&n,&m);

for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);

for(int k=1;k<=n+m;k++) for(int i=1;i<=n;i++){

	if(i>=k || k-i>m) continue;

	for(int j=1;j<=n;j++){

		if((j>=k || k-j>m) || (i==j && k!=n+m)) continue;

		f[k][i][j]=a[i][k-i]+a[j][k-j]+maxn(f[k-1][i][j],f[k-1][i-1][j-1],f[k-1][i][j-1],f[k-1][i-1][j]);

	}

}

printf("%d",f[m+n][n][n]);

return 0;

}

071maozihan

《超越》(狗头)