Nighramet 2023-04-08 11:56 采纳率: 0%
浏览 22
已结题

洛谷 P1006“传纸条”WA 求援

相关信息

原题:洛谷 P1006

WA 代码

思路是之前 P1004 的 3 维 DP(见 P1004 题解区)小改了一下,不知道错在哪里。

代码:

#include <stdio.h>
#define MAX_N 50

int n, m, map[MAX_N][MAX_N]; /* 列数、行数、地图。
                              * 地图储存是 map[x][y],且坐标从 0 开始。
                              */
int dp[MAX_N * 2][MAX_N][MAX_N]; /* DP 数组。
                                  * f(k, x_1, x_2),k 是 纸条已走的步数(或说 到00原点的曼哈顿距离),
                                  * x_1, x_2 是两张纸条的 X 坐标,k-x 可以得到相应 y 坐标。
                                  * 两张纸条同时从左上角开始传。
                                  * DP 思路解析看 洛谷 P1004 大佬的题解。
                                  */

int max(const int a, const int b, const int c, const int d) //单纯 max 函数,没啥好看的。
    { return (a > b ? a : b) > (c > d ? c : d) ? (a > b ? a : b) : (c > d ? c : d); }

main()
{
    scanf("%d %d", &m, &n); //这一块都是读入:
    for (int y = 0; y < m; y++)
        for (int x = 0; x < n; x++)
            scanf("%d", &map[x][y]);

    //DP 初始化 / 边界:
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            dp[0][i][j] = map[0][0]; /* 走 0 步均初始化为 0。
                                      * 已试过 dp[][][] 全填 0 还是 WA。
                                      */

    for (int k = 1; k <= (n + m - 3); k++) /*枚举步数。不枚举到右下角,因为:
                                            * 后面 j 循环从 i+1 开始,但会直接因为 j<n 这个条件结束。
                                            * 因此就算 k 开到 n+m-2 一样算不到右下角。
                                            */
        for (int i = 0; i <= k && i < n; i++) /* 枚举第一张纸条的X坐标。
                                               * i<n 防止越界,i<=k 只走 k 步到不了 i>k 的地方。
                                               */
            for (int j = i + 1; j <= k && j < n; j++) { //从 i+1 开始枚举,保证路径不相交。
                dp[k][i][j] = //状态转移方程:
                        max(dp[k - 1][i][j], dp[k - 1][i - 1][j], dp[k - 1][i][j - 1], dp[k - 1][i - 1][j - 1]) + map[i][k - i] + map[j][k - j];
            }


    printf("%d\n", dp[n + m - 3][n - 2][n - 1]); /* 输出答案:
                                                  * 第一张纸条到 右下点左边一格、
                                                  * 第二张纸条到 右下角上面一格 的最优解。
                                                  */
    return 0;
}
///:~

顺便贴一下第 1 个 WA 测试点的输入数据(正确答案 12203,我的输出 12284),便于调试:
由于 CSDN 限制提问字数,放在洛谷的云剪贴板里:https://www.luogu.com.cn/paste/pec15lj8


猜测应该还是有路径重复走了。

还有问题还可以在下面提。

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-08 20:19
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月9日
  • 修改了问题 4月8日
  • 创建了问题 4月8日

悬赏问题

  • ¥15 chaquopy python 安卓
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 CSS实现渐隐虚线框
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容