NC16759 方格取数

状态表示:\(f(i,j,k,l)\)表示第一个人走到\((i,j)\),第二个人走到\((k,l)\)的价值最大值

特判一下坐标相等情况就好了。

const int N=15;
int f[N][N][N][N];
int g[N][N];
int n;

int main()
{
    cin>>n;

    int a,b,c;
    while(cin>>a>>b>>c)
    {
        if(!a && !b && !c) break;
        g[a][b]=c;
    }

    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                for(int l=1;l<=n;l++)
                {
                    int w;
                    if(i == k && j == l) w=g[i][j];
                    else w=g[i][j]+g[k][l];
                    f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k-1][l]+w);
                    f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k-1][l]+w);
                    f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l-1]+w);
                    f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l-1]+w);
                }

    cout<<f[n][n][n][n]<<endl;
    //system("pause");
}
posted @ 2020-10-02 10:45  Dazzling!  阅读(142)  评论(0编辑  收藏  举报