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

news/发布时间2024/5/4 10:49:32

题意: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';}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/44611714.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

如何使用FastGateway自动申请免费的HTTPS证书?

在购买域名的时候我相信很多人都遇到了对于证书的问题,之前我也是使用阿里云的免费一年的证书,那时候感觉还好,一年更换一次,但是近期阿里云对于证书的过期时间直接砍到了三个月!让我难以接受,所以我在想吧他直接集成到我的FastGateway中,让他自动申请,自动续期!下面我…

Linux进程创建和管理

在 Linux 中,进程创建和管理的相关函数主要是 fork()、exec()、wait() 和 exit()举个例子:#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h>int main() {pid_t pid;// 创建子进程pid = fork();if (pid < 0) {/…

NU1605: 错误形式的警告: 检测到包降级的解决办法

这两行的意思是需要我们升级Maui.Controls的版本在8.0.14,取高版本。同理,再次进行:最后:#####愿你一寸一寸地攻城略地,一点一点地焕然一新#####

多线程(2)-线程同步条件变量

在 Linux 多线程编程中,条件变量是一种用于线程间同步的重要机制。它通常与互斥锁结合使用,用于解决多个线程竞争共享资源的问题。条件变量允许一个线程在等待某个条件变为真时阻塞,并且在另一个线程改变条件并通知时恢复执行。这个玩意跟内核等待队列差不多意思。在 Linux …

进程间通信(4)-信号量

Linux 中的信号量通常指的是进程间通信(IPC)中的一种机制,用于实现进程之间的同步和互斥。在 Linux 中,主要有两种类型的信号量:System V 信号量和 POSIX 信号量。 1. System V 信号量 System V 信号量是最早引入 Linux 的一种进程间通信机制,它使用 semget、semctl 和 s…

进程间通信(2)-消息队列

Linux 中的消息队列是一种进程间通信(IPC)机制,允许不同进程之间通过消息进行通信。消息队列中的相关函数:msgget:创建或打开一个消息队列。 函数原型:int msgget(key_t key, int msgflg); 参数: key:消息队列的键值,用于标识消息队列。 msgflg:标志参数,用于指定消…