首页 > 其他分享 >2023.10.1记录

2023.10.1记录

时间:2023-10-02 15:34:11浏览次数:49  
标签:y2 mat 记录 2023.10 y1 && x2 x1

被NOIP提高组的题暴虐。

[NOIP2000 提高组] 方格取数

NOIP2000 提高组] 方格取数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意

从一个\(n\times n\)的矩阵的左上角走到右下角,只能往右边和下边走,选择两条路,把这两条路经过的单位的数字取走,每个单位的数字只能取一次,求最大能取走的数字的总和。

思路

搜索,两条路一起走,每次有四种情况。但是复杂度为\(4^{2n}\),肯定会超时,所以要用记忆化搜索。

代码

#include<bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    int mat[10][10] = {0};
    while(true) {
        int x, y, z;
        cin >> x >> y >> z;
        if(!x && !y && !z) {
            break;
        }
        mat[x][y] = z;
    }

    int f[10][10][10][10] = {0};
    memset(f, -1, sizeof f);

    auto dfs = [&](auto self, int x1, int y1, int x2, int y2) ->i64 {
        if(f[x1][y1][x2][y2] != -1) {
            return f[x1][y1][x2][y2];
        }
        if(x1 == n && y1 == n) {
            return 0;
        }

        i64 res = 0;
        if(x1 < n && x2 < n) {
            res = max(res, self(self, x1 + 1, y1, x2 + 1, y2) + mat[x1 + 1][y1] + mat[x2 + 1][y2] - mat[x2 + 1][y2] * (x1 + 1 == x2 + 1 && y1 == y2));
        }
        if(y1 < n && y2 < n) {
            res = max(res, self(self, x1, y1 + 1, x2, y2 + 1) + mat[x1][y1 + 1] + mat[x2][y2 + 1] - mat[x2][y2 + 1] * (y1 + 1 == y2 + 1 && x1 == x2));
        }
        if(y1 < n && x2 < n) {
            res = max(res, self(self, x1, y1 + 1, x2 + 1, y2) + mat[x1][y1 + 1] + mat[x2 + 1][y2] - mat[x2 + 1][y2] * (x1 == x2 + 1 && y1 + 1 == y2));
        }
        if(x1 < n && y2 < n) {
            res = max(res, self(self, x1 + 1, y1, x2, y2 + 1) + mat[x1 + 1][y1] + mat[x2][y2 + 1] - mat[x2][y2 + 1] * (x1 + 1 == x2 && y1 == y2 + 1));
        }
        return f[x1][y1][x2][y2] = res;
    };

    cout << dfs(dfs, 1, 1, 1, 1) + mat[1][1] << "\n";

    return 0;
}

标签:y2,mat,记录,2023.10,y1,&&,x2,x1
From: https://www.cnblogs.com/cenqi/p/17739967.html

相关文章

  • C语言学习记录---数组2
    3.数组越界数组的下标是有范围限制的。数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味......
  • Oracle数据库升级PostgreSQL 后的踩坑记录(一)之databaseId
    背景:因为业务需求,需要整个项目除了适配oracle和mysql后还需要适配PostgreSQL,在此背景下就出现了一系列的问题。踩坑一:databaseId连接数据库后启动发现某些查询报错传入的sql参数是空,经过反复排查定位到对应的MyBaits的xml文件,我贴出原始的文件文件中判断databaseid是mysql还是oracl......
  • Spring Boot 将日志写入文件中记录
    一、介绍我们之前的一套操作来讲,日志都是在控制台上的但,如果你的项目在正式环境上跑,运维人员突然告诉你说日志报错了,但你日志只在控制台上,那公司项目如果访问量很大那你是很难在控制台上找到某一条日志的。这时,我们就可以用文件把它记下来。这样就好啦,然后我们直接启......
  • template 2023.10.01
    特斯拉ModelY2023小更新款AllInOne⚠️没有座椅通风......
  • 2023.10.1
    今天,上午去挂水了,下午去搞之前一直没搞定的一道题目,终于搞清楚了之前我一直在犯得错误,那就是这道题是64位的,我以前做过的需要泄露libc的题目,只有ctfwiki上自带的例题(32位),所以用栈溢出调用函数的时候,按照以前的想法,参数是直接放在payload里,之后payload被读到栈上后,参数就是在栈上的......
  • 2023.10.1——每日总结
    学习所花时间(包括上课):0h代码量(行):0行博客量(篇):1篇今天,上午休息,下午休息;我了解到的知识点:休息明日计划:休息......
  • 2023.10.01 日记
    1+1=2令\(f[i]\)为\(a+b=i\)的和。显然可得\(f[a]=f[a-b]+f[b],f[1]=1\)。所以可得\(1+1=f[1]+f[1]=f[2]=2\)。code#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+10;inta,b,f[maxn];intmain(){ios::sync_with_stdio(false);cin.......
  • C语言学习记录---数组1
    BIT-4-数组一维数组的创建和初始化一维数组的使用一维数组在内存中的存储二维数组的创建和初始化二维数组的使用二维数组在内存中的存储数组越界数组作为函数参数数组的应用实例1:三子棋数组的应用实例2:扫雷游戏1.一维数组的创建和初始化。1.1数组的创建数组是一组相同类型元素......
  • 一周总结(2023.9.25-2023.10.1)
    听课方面周一听了Nit的分块和莫队,前面还比较可以跟得上,后面基本掉线,写了个回滚莫队板子,口胡了前面几道题。后面就去做课件了。讲课之后补了自己的一些题,但是前面的题还比较多,需要快速补题。讲课方面在ddl之前eps秒做完了课件。还是要加速。讲课的时间还有剩余,下次要准备......
  • 2023.10.1日报
    今天配置了vue环境,学习了基础的vue语法,在这个过程中遇到了如下问题1.安装完node.js和vuecli后,创建项目的时候出现了问题我无法通过yarnserve启动项目,但由于默认下载设置的是yarn,导致也无法使用npmrunserve启动在这里卡了很久,解决办法是在C盘的user目录下有一个文件,其实后面......