neu1458 方格取数 dp解法

本文探讨了在二维矩阵中,从左上角到右下角走两次的路径最大和问题,通过动态规划方法求解,限制条件为路径上经过同一单元格仅计算一次。

题意:

有N * N个格子,每个格子里有正数或者0,从最左上角往最右下角走,只能向下和向右,一共走两次(即从左上角走到右下角走两趟),把所有经过的格子的数加起来,求最大值SUM,且两次如果经过同一个格子,则最后总和SUM中该格子的计数只加一次。


走两次,所以状态表示要同时表示两次路径。dp[i][j][k][l] 表示第一次走到i,  j,第二次走到k, l得到的最大值,这里i + j == k + l

其实第四维是可以通过前三维算出来的,所以可以去掉

那么dp[i][j][k] 可以通过四种状态转移,(i, j - 1, k)  (i,  j - 1, k - 1) (i - 1,  j,  k) (i - 1, j, k - 1)即两次都可以选择是从上或者左边移动过来

因为i + j == k + l,所以 i + j - k是l 的位置,1 <= l <= n,即 i + j <= k + n && i + j >= k + 1 


#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <string>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <vector>
#include <iostream>
#include <algorithm>
#include <bitset>
#include <fstream>
using namespace std;
//LOOP
#define FF(i, a, b) for(int i = (a); i < (b); ++i)
#define FE(i, a, b) for(int i = (a); i <= (b); ++i)
#define FED(i, b, a) for(int i = (b); i>= (a); --i)
#define REP(i, N) for(int i = 0; i < (N); ++i)
#define CLR(A,value) memset(A,value,sizeof(A))
#define FC(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
//OTHER
#define SZ(V) (int)V.size()
#define PB push_back
#define MP make_pair
#define all(x) (x).begin(),(x).end()
//INPUT
#define RI(n) scanf("%d", &n)
#define RII(n, m) scanf("%d%d", &n, &m)
#define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)
#define RIV(n, m, k, p) scanf("%d%d%d%d", &n, &m, &k, &p)
#define RV(n, m, k, p, q) scanf("%d%d%d%d%d", &n, &m, &k, &p, &q)
#define RS(s) scanf("%s", s)
//OUTPUT
#define WI(n) printf("%d\n", n)
#define WS(n) printf("%s\n", n)
//debug
//#define online_judge
#ifndef online_judge
#define dt(a)  << (#a) << "=" << a << " "
#define debugI(a) cout dt(a) << endl
#define debugII(a, b) cout dt(a) dt(b) << endl
#define debugIII(a, b, c) cout dt(a) dt(b) dt(c) << endl
#define debugIV(a, b, c, d) cout dt(a) dt(b) dt(c) dt(d) << endl
#define debugV(a, b, c, d, e) cout dt(a) dt(b) dt(c) dt(d) dt(e) << endl
#else
#define debugI(v)
#define debugII(a, b)
#define debugIII(a, b, c)
#define debugIV(a, b, c, d)
#endif

#define sqr(x) (x) * (x)
typedef long long LL;
typedef unsigned long long ULL;
typedef vector <int> VI;
const double eps = 1e-9;
const int MOD = 1000000007;
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int maxn = 105;

int dp[maxn][maxn][maxn];
int w[maxn][maxn];

int main()
{
    //freopen("0.txt", "r", stdin);
    int n;
    while (~RI(n))
    {
        FE(i, 1, n) FE(j, 1, n) RI(w[i][j]);
        CLR(dp, 0);
        FE(i, 1, n)
        {
            FE(j, 1, n)
            {
                FE(k, 1, n)
                    if (i + j >= k + 1 && i + j <= k + n)
                    {
                        int t = max(dp[i][j - 1][k - 1], dp[i][j - 1][k] )
                                    + (k == i ? w[i][j] : w[i][j] + w[k][i + j - k]);
                        if (t > dp[i][j][k])
                            dp[i][j][k] = t;
                        t = max(dp[i - 1][j][k - 1], dp[i - 1][j][k])
                                + (k == i ? w[i][j] : w[i][j] + w[k][i + j - k]);
                        if (t > dp[i][j][k])
                            dp[i][j][k] = t;
                    }
            }
        }
        WI(dp[n][n][n]);
    }
    return 0;
}



<think>好的,用户的问题是关于NEU据集中标签字的含义。我需要先明确NEU据集的具体背景。NEU通常指东北大学(Northeastern University)发布的据集,常见的有NEU表面缺陷据集,主要用于工业检测,如钢材表面的六类缺陷。标签字可能对应这些缺陷类别。 首先,我需要确认NEU据集的标准结构。通常,在目标检测任务中,每个图像的标注文件(如YOLO格式的.txt文件或VOC的XML)会包含类别编号、边界框坐标等信息。例如,字0-5可能代表不同的缺陷类型,如裂纹、夹杂等。 接下来,用户可能没有提供据集的详细文档,所以需要参考常见的NEU版本。根据公开资料,NEU-DET据集包含六个类别:Crazing、Inclusion、Patches、Pitted Surface、Rolled-in Scale、Scratches。对应的标签字0到5分别对应这些类别。 同时,用户可能在使用类似YOLO的模型进行训练,引用中提到的labelImg工具YOLOv5训练流程,说明标签格式可能是YOLO的。每个标注行的第一个字就是类别编号。需要确认是否正确,并提醒用户检查标注文件中的字是否在0-5之间,避免出现错误标签,如引用[2]中提到的标注错误情况。 此外,用户可能需要了解如何处理标签字与类别名称的映射,建议查看据集自带的class.txt或相关文档。如果用户遇到问题,比如标签字超出范围,可以指导他们使用脚本验证,如Python脚本统计所有标签字,确保符合预期。 最后,生成相关问题时,考虑用户可能的后续需求,如据集的制作、标注工具的使用、模型训练中的标签处理等,确保覆盖常见的使用场景。</think>### NEU据集标签字含义解析 NEU据集(东北大学钢材表面缺陷据集)是工业检测领域常用的据集,其标签字对应6种钢材表面缺陷类别。具体含义如下: $$ \text{标签字} \rightarrow \text{缺陷类型映射表} $$ | 字 | 缺陷类型(英文) | 中文名称 | |------|------------------------|------------------| | 0 | Crazing | 裂纹 | | 1 | Inclusion | 夹杂 | | 2 | Patches | 斑块 | | 3 | Pitted Surface | 点蚀表面 | | 4 | Rolled-in Scale | 轧制氧化皮 | | 5 | Scratches | 划痕 | #### 标注文件示例(YOLO格式) 标注文件为.txt格式,每行表示一个目标: ``` <class_id> <x_center> <y_center> <width> <height> ``` 例如: ``` 1 0.435 0.712 0.12 0.08 ``` 表示检测到一个**夹杂**缺陷(class_id=1),其归一化边界框坐标为$(0.435,0.712)$,宽高为$(0.12,0.08)$[^1]。 #### 注意事项 1. **标签验证**:需检查标签文件中的字是否全部在0-5范围内,避免出现类似引用[2]中提到的无效标签问题 2. **映射文件**:建议创建`classes.txt`文件明确记录类别对应关系 3. **标注规范**:使用labelImg等工具标注时需固定类别名称与字的对应关系[^1][^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值