一只松鼠发现了一个存放坚果的储藏室。
储藏室包含 行房间,编号从 到 。
索引为 的一行包含 个房间,编号从 到 。
位于第 行第 列的房间包含 个坚果。
在 个房间中,数 两两不同,且取值在 到 之间。
形式化地说,储藏室的形状是一个三角形半矩阵,即主对角线下方(包含主对角线)的那一部分,其中每个元素表示坚果数量。
这个半矩阵中的数是从 到 的所有整数,每个数恰好出现一次。
例如,当 时,储藏室会有 15 个房间,包含从 1 到 15 的数字。
这种储藏室的一个例子可以是下面所示的半矩阵:
::::align{center}
::::
松鼠沿着主对角线行走,并且在位于 的每个房间,它会选择一个位于以 为右上角、以 为左下角的矩形中的房间,并吃掉该房间里的橡实。
在上面的例子中,当松鼠位于 时,它可以选择吃掉红色标出的 8 个房间中的任意一个房间里的坚果。
当它走过主对角线上的所有房间并且恰好吃了 个不同房间里的坚果后,松鼠心满意足地离开。
要求:给定 以及对任意 和 的 ,求松鼠最多能吃到多少坚果。
同时,对于它访问的 个房间中的每一个,求松鼠所吃的坚果数量。
实现细节
这是一道(函数式)交互题。你不需要,也不应该定义 main 函数。
你需要实现函数
void solve(int N, vector<vector<int>> A, long long& answer, vector<int>& solution)
函数参数:
输入数据:
int N:储藏室大小 / 行数
vector<vector<int>> A:每个房间中的坚果数量(更准确地说,在 中, 且 ,你会找到第 行第 个位置的房间中的坚果数量)
输出数据:
long long &answer:将包含松鼠走过对角线上的全部 个房间后能够吃到的最大坚果数量。
vector<int> &solution:一个 vector<int>,包含松鼠在每个房间中吃到的坚果数量。(更准确地说, 且 表示松鼠位于房间 时吃到的坚果数量)
注意:对于 和 ,下标从 开始,并且 的大小应当恰好为 。