问题陈述:
在一个平行宇宙中,计算机科学中最重要的数据结构是三角形。大小为M的三角形包含M行,第i行包含i个元素。此外,这些行必须排列成等边三角形的形状。也就是说,每一行都以垂直通过三角形中心的对称线为中心。例如,下图显示了一个大小为4的三角形:
三角形包含子三角形。例如,上面的三角形包含1个大小为1的子三角形、6个大小为2的子三角形(其中包括包含(3,1,2)和包含(4,6,1)的三角形),3个大小为3的子三角形(其中包括包含(2,2,1,1,4,2)的三角形)。请注意,每个三角形都是其自身的子三角形。
给定大小为N的三角形,必须找到所有大小为K的子三角形的最大元素的总和。
输入格式
第一行包含两个以空格分隔的整数N和K(1≤K≤N≤3000)。
接下来N行描述三角形。其中第i行包含i个以空格分隔的整数ai,j(0≤ai,j≤10^9),表示三角形的第i行。
对于15个可用分数中的4个,N≤1000。
输出格式
输出大小为K的所有子三角形的最大元素的总和。
样本输入
4 2
3
1 2
4 2 1
6 1 4 2
样例输入的输出结果
23
很不幸,我的解决方案被判定为TLE,并且我不知道如何对其进行优化。
这个问题基本上是要求找到子三角形的最大元素并将它们相加。我的方法很直接,我迭代了大三角形的每个元素,使它们成为子三角形的“根”,然后尝试去每个元素中寻找最大值并将它们加到结果中。
我需要一些帮助来改进我的解决方案,是否需要某种数据结构?
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
vector<vector<int>> triangle;
int n;
int k;
cin >> n >> k;
for (int i = 0; i < n; ++i)
{
triangle.push_back(vector<int>(i + 1, 0));
for (int j = 0; j <= i; ++j)
cin >> triangle[i][j];
}
int sum = 0;
for (int level = 0; level <= n - k; ++level)
for (int root = 0, size1 = triangle[level].size(); root < size1; ++root)
{
int largest = 0;
for (int i = level, counter = 0; i < level + k; ++i, ++counter)
for (int j = root, times = 0, size2 = triangle[i].size(); j < size2 && times <= counter; ++j, ++times)
largest = max(largest, triangle[i][j]);
sum += largest;
}
cout << sum << "\n";
return 0;
}