Euler三角形问题是找到从第一个数字到最后一个数字之一(最后一行)的最大总和
所以输入可以是:
5 //the number of rows
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出应为:
30
7 3 8 7 5
我能找到SUM(例如30),但我找不到一种方法来正确找到所有总结的元素。
这是功能:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int m;
cin >> m;
int tri[m][m];
for(int i=0; i < m; i++)
{
for(int j=0; j <= i; j++)
{
cin >> tri[i][j];
}
}
for (int i=m-2; i>=0; i--)
{
for (int j=0; j<=i; j++)
{
if (tri[i+1][j] > tri[i+1][j+1])
{
tri[i][j] += tri[i+1][j];
}
else
tri[i][j] += tri[i+1][j+1];
}
}
cout << tri[0][0];
return 0;
}
使用向量矩阵的方法:
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
int main()
{
int m;
cin >> m;
vector<int> tri[m][m];
int input;
for(int i=0; i < m; i++)
{
for(int j=0; j <= i; j++)
{
cin >> input;
tri[i][j].push_back(input);
}
}
//make other entries zero
for(int i=0; i < m; i++)
for(int j=0; j < m; j++)
for(unsigned int k=0; k < tri[i][j].size(); k++)
if(tri[i][j][k] > 1000)
tri[i][j][k] = 0;
vector<int> input_vec;
int sum_of_elem1, sum_of_elem2;
for (int i=m-2; i>=0; i--)
{
for (int j=0; j<=i; j++)
{
sum_of_elem1 = accumulate(tri[i+1][j].begin(), tri[i+1][j].end(), 0);
sum_of_elem2 = accumulate(tri[i+1][j+1].begin(), tri[i+1][j+1].end(), 0);
if (sum_of_elem1 > sum_of_elem2)
{
tri[i][j] = tri[i+1][j];
}else
tri[i][j] = tri[i+1][j+1];
}
}
int sum_of_elem3 = accumulate(tri[0][0].begin(), tri[0][0].end(), 0);
cout << sum_of_elem3;
for(int i=0; i<5; i++)
{
cout << tri[0][0][i] << " ";
}
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
{
tri[i][j].clear();
}
}
return 0;
}