您的位置:首页 > 编程语言

DP入门,HDU 2084 数塔 参考代码

2011-11-17 22:11 465 查看
HDU 2084 数塔

//DP入门,数塔, HDU 2084
//以C++编译器提交

#include <iostream>
using namespace std;

#define N 100
int f

;

//状态:f[i,j], 算到第i行j列时的最大值
//转移方程:f[i,j]=f[i,j]+max(f[i-1,j],f[i-1,j-1])
//初值:直接输入
//结果:max(f[n-1,j]),  0<=j<n

int dpDown(int n)//从上往下算
{
int i, j, maxVal;

for(i=1;i<n;i++) //第一列只能从上面竖走下来
{
f[i][0] = f[i-1][0] + f[i][0];
}

for(i=1;i<n;i++)//从第二行开始做
{
for(j=1;j<=i;j++)
{
if (f[i-1][j]>f[i-1][j-1])//斜走、竖走中取大者
f[i][j] = f[i][j] + f[i-1][j];
else
f[i][j] = f[i][j] + f[i-1][j-1];
}
}

//取最后一行中的最大值
maxVal=f[n-1][0];

for(i=1;i<n;i++)
{
if (maxVal<f[n-1][i]) maxVal=f[n-1][i];
}

return maxVal;
}

//状态:f[i,j], 算到第i行j列时的最大值
//转移方程:f[i,j]=f[i,j]+max(f[i+1,j],f[i+1,j+1])
//初值:直接输入
//结果:f[0,0]

int dpUp(int n)//从下往上算
{
int i, j;

for(i=n-2;i>=0;i--) //从倒数第二行开始做
{
for(j=0;j<=i;j++)
{
if (f[i+1][j]>f[i+1][j+1])//斜走、竖走中取大者
f[i][j] += f[i+1][j];
else
f[i][j] += f[i+1][j+1];
}
}

return f[0][0];
}

void run()
{
int i, j, n, res;

scanf("%d", &n);

for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
scanf("%d", &f[i][j]);
}
}

//res=dpDown(n);
res=dpUp(n);

printf("%d\n", res);
}

int main()
{
#ifndef ONLINE_JUDGE
freopen("e:\\input.txt","r",stdin);
#endif

int i, n;
scanf("%d", &n);
for(i=0;i<n;i++) run();

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: