最小总和问题
将正整数排成等边三角形,三角形的底边有n个数,下图给出了一个n=4的例子。从三角形的顶点出发通过一系列相邻整数(在图中用圆圈表示),如何使得到达底边时的总和最小?为这个问题设计一个动态规划算法并给出时间效率。
2
5 4
1 4 7
8 6 9 6
@浅夏沫若.code:
#include<iostream>
using namespace std;
using namespace std;
int main()
{
int f[101][101] = { 0 };
int n = 0;
int minData =INT_MAX;
cout << "输入三角形底边数目:";
cin >> n;
for (int i = 0; i <=n; i++) //边缘值置无穷大
{
f[i][0] = INT_MAX;
f[0][i] = INT_MAX;
}
cout << "输入各节点的数:"<< endl;
for(int i=1;i<=n;i++)
for (int j = 1; j <= n; j++)
{
if (j <= i)
cin >> f[i][j];
else
f[i][j] = INT_MAX;
}
for (int i = 2; i <= n; i++) //求各节点动态规划过程中的值
{
for (int j = 1; j <=i; j++)
{
if (f[i - 1][j - 1] < f[i - 1][j])
f[i][j] += f[i - 1][j - 1];
else if (f[i - 1][j - 1] >f[i - 1][j])
f[i][j] += f[i - 1][j];
else if (f[i - 1][j - 1] ==f[i - 1][j])
f[i][j] += f[i - 1][j];
cout << f[i][j] << " ";
}
cout << endl;
}
for (int i = 1; i <= n; i++)
{
if (f[n][i] < minData)
minData = f[n][i];
}
cout << "到达底边时的最小总和为:" << minData << endl;
return 0;
}
{
int f[101][101] = { 0 };
int n = 0;
int minData =INT_MAX;
cout << "输入三角形底边数目:";
cin >> n;
for (int i = 0; i <=n; i++) //边缘值置无穷大
{
f[i][0] = INT_MAX;
f[0][i] = INT_MAX;
}
cout << "输入各节点的数:"<< endl;
for(int i=1;i<=n;i++)
for (int j = 1; j <= n; j++)
{
if (j <= i)
cin >> f[i][j];
else
f[i][j] = INT_MAX;
}
for (int i = 2; i <= n; i++) //求各节点动态规划过程中的值
{
for (int j = 1; j <=i; j++)
{
if (f[i - 1][j - 1] < f[i - 1][j])
f[i][j] += f[i - 1][j - 1];
else if (f[i - 1][j - 1] >f[i - 1][j])
f[i][j] += f[i - 1][j];
else if (f[i - 1][j - 1] ==f[i - 1][j])
f[i][j] += f[i - 1][j];
cout << f[i][j] << " ";
}
cout << endl;
}
for (int i = 1; i <= n; i++)
{
if (f[n][i] < minData)
minData = f[n][i];
}
cout << "到达底边时的最小总和为:" << minData << endl;
return 0;
}