洛谷【P1004】方格取数

浅谈\(DP\)https://www.cnblogs.com/AKMer/p/10437525.html

题目传送门:https://www.luogu.org/problemnew/show/P1004

\(f[i][j][k][l]\)表示第一条路从\((1,1)\)走到\((i,j)\),第二条路从\((1,1)\)走到\((k,l)\)能取的最大权值。

然后直接暴力四种更新。洛谷题解对于优化也讲了不少。(省选前刷这种水题是不是搞错了什么)

时间复杂度:\(O(n^4)\)

空间复杂度:\(O(n^4)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;

int n;
int num[10][10];
int f[10][10][10][10];

int read() {
    int x=0,f=1;char ch=getchar();
    for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
    return x*f;
}

int main() {
    n=read();
    while(1) {
        int x=read(),y=read(),v=read();
        if(!(x+y+v))break;num[x][y]=v;
    }
    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++) {
                    f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k-1][l]+num[i][j]);
                    f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l-1]+num[i][j]);
                    f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k-1][l]+num[i][j]);
                    f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l-1]+num[i][j]);
                    if(i!=k||j!=l)f[i][j][k][l]+=num[k][l];
                }
    printf("%d\n",f[n][n][n][n]);
    return 0;
}
posted @ 2019-02-26 15:26  AKMer  阅读(209)  评论(0编辑  收藏  举报