首页 > 其他分享 >洛谷 P1004 [NOIP2000 提高组] 方格取数

洛谷 P1004 [NOIP2000 提高组] 方格取数

时间:2024-04-04 13:22:05浏览次数:25  
标签:NOIP2000 cur P1004 取数 grid && x2 x1 dp

题意:n*n的方格,从左上角到右下角两次。每一次经过的路径中,如果有数字,数字都会变成0并计数。求两次路径的最大计数。

思路:线性dp,从左上角到右下角步数固定为 2 * n - 2步。 初始时0步dp[0][1][1] = grid[1][1],知道了x1和x2可以确定对应的y,可以直接进行状态转移。 可以增加剪枝:x <= min(n, s1 + 1)。

总结:
1 忽略了当到了终点时x1 == x2的情况,被直接跳过了。
2 忽略了x不动,当前步数都是由y移动的情况(4种转移状态之一)

  void solve(){
    int n;
    cin >> n;

    vector<vector<int>> grid(n + 1, vector<int>(n + 1, 0));
    {
        int x, y, k;
        while (cin >> x >> y >> k && (x && y && k)){
            grid[x][y] = k;
        }
    }

    vector<vector<vector<int>>> dp(2, vector<vector<int>>(n + 1, vector<int>(n + 1)));
    dp[0][1][1] = grid[1][1];
    int p = 0;
    for (int s = 1; s <= 2 * n - 2; ++s){
        p ^= 1;
        for (int x1 = 1; x1 <= min(n, s + 1); ++x1){
                for (int x2 = 1; x2 <= min(n, s + 1); ++x2){
                    if ((x1 != x2) || s == 2 * n - 2){
                        int y1 = s + 2 - x1;
                        int y2 = s + 2 - x2;
                        if (y1 <= n && y2 <= n){
                            auto& cur = dp[p][x1][x2];
                            if (x1 > 1 && x2 > 1){
                                cur = max(cur, dp[p ^ 1][x1 - 1][x2 - 1] + grid[x1][y1] + grid[x2][y2]);
                            }
                            if (x1 > 1 && y2 > 1){
                                cur = max(cur, dp[p ^ 1][x1 - 1][x2] + grid[x1][y1] + grid[x2][y2]);
                            }
                            if (x2 > 1 && y1 > 1){
                                cur = max(cur, dp[p ^ 1][x1][x2 - 1] + grid[x1][y1] + grid[x2][y2]);
                            }
                            if (y1 > 1 && y2 > 1){
                                cur = max(cur, dp[p ^ 1][x1][x2] + grid[x1][y1] + grid[x2][y2]);
                            }
                        }
                    }
                }
        }
    }/*
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= n; ++j){
            cout <<  grid[i][j] << " \n"[j == n];
        }
    }
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= n; ++j){
            cout <<  dp[p][i][j] << " \n"[j == n];
        }
    }*/
    cout << dp[p][n][n] - grid[n][n] << '\n';

}

标签:NOIP2000,cur,P1004,取数,grid,&&,x2,x1,dp
From: https://www.cnblogs.com/yxcblogs/p/18114114

相关文章

  • 【INDEX_SS】使用HINT使SQL用索引跳跃扫描(Index Skip Scan)方式快速获取数据
    索引跳跃扫描(IndexSkipScan)可以使用到复合索引的非前缀索引列,达到改善性能的作用,前提是全表扫面的代价高于索引跳跃式扫描的代价。这里给出使用HINT方法使SQL走索引跳跃扫描的方法。1.初始化环境1)创建表Tsec@ora10g>createtablet(xnumber,ynumber);Tablecreated.2)初始化10......
  • Vue从后端取数据,实现动态路由
    1.App.vue将获取菜单的方法放在全局中,以便每次刷新页面时,能够加载出。this.$store.state.userInfo是登入后存放在Vuex的用户信息TODO:把数据放到本地存储,没有的时候再加载,这只是demo<template><divid="app"><router-view/></div></template><script>import{......
  • 1.获取数据
    importpandasaspdimportmatplotlib.pyplotaspltplt.rcParams['font.sans-serif']=['SimHei']importtushareastsimportosdefget_data(code,start='1990-1-1',end='2021-1-1'):df=ts.get_k_data(code,autype=......
  • 【洛谷】P1004 [NOIP2000提高组]方格取数
    题目描述题目描述设有N×N 的方格图(N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0。如下图所示(见样例):某人从图的左上角的 A 点出发,可以向下行走,也可以向右走,直到到达右下角的 B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为......
  • 【Pavia】遥感图像数据集下载地址和读取数据集代码
    【Pavia】遥感图像数据集下载地址和读取数据集代码目录【Pavia】遥感图像数据集下载地址和读取数据集代码前言Pavia数据集Pavia数据集地址:Pavia数据集预览PaviaU.matPaviaU_gt.matPavia数据集的Matlab读取方式Pavia数据集中PaviaU.mat的matlab读取代码Pavia数据集中PaviaU_gt.ma......
  • Scala第十二章节(Source读取数据的功能、写入数据的功能以及学员成绩表案例)
    章节目标掌握Source读取数据的功能掌握写入数据的功能掌握学员成绩表案例1.读取数据在Scala语言的Source单例对象中中,提供了一些非常便捷的方法,从而使开发者可以快速的从指定数据源(文本文件,URL地址等)中获取数据,在使用Source单例对象之前,需要先导包,即......
  • 字符串中提取数字
    10.16输入一个字符串,内有数字和非数字字符,如:                 a123x45617960?302tab5876将其中连续的数字作为一个整数,依次存放到一数组num中。例如123放在num[0]中,456放在num[1]中……统计共有多少个整数,并输出这些数。#include<stdio.h>#include<s......
  • 字节流读取数据
    importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;publicclassMain{publicstaticvoidmain(String[]args)throwsIOException{FileInputStreamfileInputStream=new......
  • P1017 [NOIP2000 提高组] 进制转换题解
    题目我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所处位置为指数,以10为底数的幂之和的形式。例如123可表示为1×102+2×101+3×100这样的形式。与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置为指数,以2为底数的幂之......
  • XSS 从 PDF 中窃取数据
    XSS从PDF中窃取数据将服务器端XSS注入到动态生成的PDF中在hackthebox的Book机器(ScriptingTrack)上,我遇到了一个Web应用程序,它使用用户控制的输入来生成PDF文件。用户输入输入,下载时该输入将呈现为PDF文件。我从阅读许多文章中意识到与动态生成的PDF相关的......