数塔问题:设有一个三角形数塔(如下图所示),求自塔顶至塔底的一条路径,使得该路径上结点的值的总和最大。设计动态规划算法,并分析时间复杂性。
code:
#include <iostream>
using namespace std;
#define n 4
void output(int data[][4], int lenth)
{
cout<<endl;
for (int i=0; i<lenth; i++)
{
for (int j=0; j<lenth; j++)
{
//cout<<data[i][j]<<" ";
printf("%2d ",data[i][j]);
}
cout<<endl;
}
}
int main()
{
int data[n][n] = { 13,0,0,0, 11,8,0,0, 12,7,16,0, 6,14,15,8 };
int ta[n][n] = {0};
int H[n][n] = {0};
int i,j;
for (i=0; i<n; i++)
{
ta[n-1][i] = data[n-1][i];
}
for (i=n-2; i>=0; i--)
{
for (j=0; j<=i; j++)
{
if (ta[i+1][j] > ta[i+1][j+1])
{
ta[i][j] = ta[i+1][j] + data[i][j];
}
else
{
ta[i][j] = ta[i+1][j+1] + data[i][j];
H[i][j] = 1;
}
}
}
cout<<endl<<"ta:";
output(ta, n);
cout<<endl<<"H:";
output(H,n);
cout<<endl<<"quan="<<ta[0][0]<<endl;
cout<<endl<<"path: "<<data[0][0]<<" ";
for (i=0, j=0; i<n-1; i++)
{
if (H[i][j] == 0)
{
cout<<data[i+1][j]<<" ";
}
else
{
cout<<data[i+1][j+1]<<" ";
j++;
}
}
cin.get();
return 0;
}