hdu 2084
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
本题可以从上往下递推,也可以从下往上递推。
从下往上:
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int c,n,data[102][102],inp[102][102];
cin>>c;
while(c--)
{
cin>>n;
memset(data,0,sizeof(data));
memset(inp,0,sizeof(data));
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>data[i][j];
for(int k=1;k<=n;k++)
inp[n][k]=data[n][k];
for(int i=n-1;i>=1;i--)
for(int j=1;j<=i;j++)
inp[i][j]=data[i][j]+max(inp[i+1][j],inp[i+1][j+1]);
cout<<inp[1][1]<<endl;
}
//system("PAUSE");
return EXIT_SUCCESS;
}
----------------------------------------------------------------------------
从下往上推,也很容易:
#include <iostream>
#include <cstring>
using namespace std;
int data[102][102];//���������������
int inp[102][102];// ������������
int main()
{
int n;
while(cin>>n)
{
memset(inp,0,sizeof(inp));
memset(data,0,sizeof(data));
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
{
cin>>data[i][j];
if (i==1) inp[i][j]=data[i][j];
else
inp[i][j]=max(inp[i-1][j],inp[i-1][j-1])+data[i][j];
}
int tmp=0;
for(int k=1;k<=n;k++)
if (tmp<=inp[n][k]) tmp=inp[n][k];
cout<<tmp<<endl;
}
//cout << "Hello world!" << endl;
return 0;
}