• 洛谷【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
    ",f[n][n][n][n]);
        return 0;
    }
    
  • 相关阅读:
    层模型--绝对定位(position:absolute)
    什么是层模型?
    浮动模型
    流动模型(二)
    插值方法
    CFS调度分析(内核版本:2.6.34)
    CRC检验
    ubuntu误删home目录
    随想
    Android——Activity生命周期
  • 原文地址:https://www.cnblogs.com/AKMer/p/10437655.html
Copyright © 2020-2023  润新知