您的位置:首页 > 其它

P1044 数字三角形

2010-11-13 23:43 253 查看
题目来源:http://www.tyvj.cn:8080/Problem_Show.asp?id=1044

背景 Background
09年 USACO 11月月赛 铜牌第一道
描述 Description
示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
径,使该路径所经过的数字的总和最大。
 每一步可沿左斜线向下或右斜线向下走;
 1<三角形行数<25;
 三角形中的数字为整数<1000;

输入格式 Input Format
第一行为N,表示有N行
后面N行表示三角形每条路的路径权
输出格式 Output Format
路径所经过的数字的总和最大的答案
经典动态规划

ans[i][j]表示到第(i,j)坐标的最大的结果

则:

ans[i][j]=max(ans[i-1][j],ans[i-1][j-1])+num[i][j];

#include<iostream>
#include<memory.h>
using namespace std;
int **num;
int **ans;
int n;
int main()
{
cin>>n;
num=new int*[n+1];
ans=new int*[n+1];
for (int i=0;i<=n;i++)
{
ans[i]=new int[n+1];
num[i]=new int[n+1];
memset(ans[i],0,sizeof(int)*(n+1));
memset(num[i],0,sizeof(int)*(n+1));
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=i;j++)
{
cin>>num[i][j];
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=i;j++)
{
ans[i][j]=max(ans[i-1][j],ans[i-1][j-1])+num[i][j];
}
}
int max1=0;
for (int i=1;i<=n;i++)
{
if (ans
[i]>max1)
{
max1=ans
[i];
}
}
cout<<max1;
return 0;
}


评测结果:

VijosNT Mini 2.0.5.4

#01: Accepted (0ms, 220KB)
#02: Accepted (0ms, 220KB)
#03: Accepted (0ms, 220KB)
#04: Accepted (0ms, 220KB)
#05: Accepted (0ms, 224KB)
#06: Accepted (0ms, 224KB)
#07: Accepted (0ms, 224KB)
#08: Accepted (0ms, 224KB)
#09: Accepted (0ms, 224KB)
#10: Accepted (0ms, 224KB)

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