2020.3.16 Luogu1004方格取数

显然DP
与传纸条类似,拆成两个人
方法尽量变简单,即把A出发,B出发合并成两个A出发,两个A同时走,这样可以避免A取完B再取的无法判断的情况
状态转移方程:
1.\(x == z \; and \;y == d\),\(f[x][y][z][t] = max(f[x - 1][y][z - 1][t], f[x - 1][y][z][t - 1], f[x][y - 1][z - 1][t], f[x][y - 1][z][t - 1]) + a[x][y]\)
2.else,\(f[x][y][z][t] = max(f[x - 1][y][z - 1][t], f[x - 1][y][z][t - 1], f[x][y - 1][z - 1][t], f[x][y - 1][z][t - 1]) + a[x][y] + a[z][t]\)

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 10;

int n, a[N][N], x, y, z;
int f[N][N][N][N];

inline int DP(int x, int y, int z, int t)
{
    if (x == 0 || y == 0 || z == 0 || t == 0)
        return 0;
    if (f[x][y][z][t] != -1)
        return f[x][y][z][t];
    int ret = max(DP(x - 1, y, z - 1, t), max(DP(x - 1, y, z, t - 1), max(DP(x, y - 1, z - 1, t), DP(x, y - 1, z, t - 1))));
    if (x == z && y == t)
        ret += a[x][y];
    else
        ret += a[x][y] + a[z][t];
    return f[x][y][z][t] = ret;
}

int main()
{
    cin >> n;
    while (cin >> x >> y >> z)
    {
        if (x == 0 && y == 0 && z == 0)
            break ;
        a[x][y] = z;
    }
    memset(f, -1, sizeof f);
    f[1][1][1][1] = a[1][1];
    cout << DP(n, n, n, n) << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/pipa-peng/p/12506839.html

时间: 2024-11-04 06:27:04

2020.3.16 Luogu1004方格取数的相关文章

hdu 1565 方格取数(2)(网络流之最大点权独立集)

题目链接:hdu 1565 方格取数(2) 题意: 有一个n*m的方格,每个方格有一个数,现在让你选一些数.使得和最大. 选的数不能有相邻的. 题解: 我们知道对于普通二分图来说,最大独立点集 + 最小点覆盖集 = 总点数,类似的,对于有权的二分图来说,有: 最大点权独立集 + 最小点权覆盖集 = 总点权和, 这个题很明显是要求 最大点权独立集 ,现在 总点权 已知,我们只要求出来 最小点权覆盖集 就好了,我们可以这样建图, 1,对矩阵中的点进行黑白着色(相邻的点颜色不同),从源点向黑色的点连一

P1004 方格取数

P1004 方格取数 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0.如下图所示(见样例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0 0 0 0 21 0 0 0 4 0 0 0 0 15 0 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 . B 某人从图的左上角的A点出发,可以向下行走,也可以向右走,直到到达右下角

1475: 方格取数

1475: 方格取数 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 578  Solved: 309[Submit][Status][Discuss] Description 在一个n*n的方格里,每个格子里都有一个正整数.从中取出若干数,使得任意两个取出的数所在格子没有公共边,且取出的数的总和尽量大. Input 第一行一个数n:(n<=30) 接下来n行每行n个数描述一个方阵 Output 仅一个数,即最大和 Sample Input 2 1 2

HDU 1569 方格取数(2)

方格取数(2) Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 156964-bit integer IO format: %I64d      Java class name: Main 给你一个m*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大. Inpu

XTU 二分图和网络流 练习题 C. 方格取数(1)

C. 方格取数(1) Time Limit: 5000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d      Java class name: Main 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. Input 包括多个测试实例,每个测试实例包括一个整数n 和n*n个非负数(n<=20) Output 对

HRBUST 1214 方格取数

方格取数 Time Limit: 1000ms Memory Limit: 65535KB This problem will be judged on HRBUST. Original ID: 121464-bit integer IO format: %lld      Java class name: Main 设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放人数字0.如下图所示(见样例 ,黄色和蓝色分别为两次走的路线,其中绿色的格子为黄色和蓝色共同走

hdu1565方格取数(1)【最大流||最大点权独立集】

Problem Description 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. Input 包括多个测试实例,每个测试实例包括一个整数n 和n*n个非负数(n<=20) Output 对于每个测试实例,输出可能取得的最大的和 Sample Input 3 75 15 21 75 15 28 34 70 5 Sample Output 188 预备知识: 对于一个无向

Laoj P1197 简单的方格取数

问题背景 动态规划入门-第16题 试题描述 设有N*N的方格图(N<=200,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样例): A0 0  0 0 0 0 0 00 0 13 0 0 6 0 00 0  0 0 7 0 0 00 0 0 14 0 0 0 00 21 0 0 0 4 0 00 0 15 0 0 0 0 00 14 0 0 0 0 0 00  0 0 0 0 0 0 0 B 某人从图的左上角的A 点出发,可以向下行走,也可以向右走,直到到达右下角

HDU1565方格取数(1)(状态压缩DP)

方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5530    Accepted Submission(s): 2094 Problem Description 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出