10303 数字三角
来源:互联网 发布:ubuntu安装gnome2 编辑:程序博客网 时间:2024/06/05 06:56
10303 数字三角(必做)
时间限制:1000MS 内存限制:65535K
提交次数:117 通过次数:56
题型: 编程题 语言: C++;C;VC;JAVA
Description
问题描述:给定一个由n行数字组成的数字三角形,如下图所示。试用动态规划算法,计算出从三角顶部至底部的一条路径,使得该路径经过的数字总和最大。注意每个数字只能走向下一行左边或右边的数字,而不能跳跃的走。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输入格式
第一行是数字三角的行数n,1<=n<=100。接下来n行是数字三角各行中的数字,所有数字在0~99之间。
输出格式
输出两行,第一行是计算出的最大路径的和值,第二行是该路径上的数字。若有多条路径,靠右的路径优先(即仅仅输出靠右的路径即可,无需多条路径都输出)。如:Input: 573 88 1 62 7 4 44 5 2 4 5有两条路径:7-3-8-7-5和7-8-6-4-5都为30,由于后者靠右,因此仅输出后者。Output: 307 8 6 4 5
输入样例
573 88 1 02 7 4 44 5 2 6 5
#include <iostream>
#include <stdio.h>
using namespace std;
int n;
int a[10000][10000],b[10000][10000]; //记录数据 、 记录计算的和 1<=n<=100
void findP(){
for(int i=n;i>=1;i--)
{
for(int j=1;j<=i;j++)
{
if(j==n) b[i][j]= a[i][j]; //底层节点值和 = 本身节点值
else {
if(b[i+1][j]>b[i+1][j+1]) //本节点值和 =取下一层子树值和的最大值 + 本节点值
b[i][j] = b[i+1][j] + a[i][j];
else
b[i][j] = b[i+1][j+1] + a[i][j];
}
}
}
}
int main()
{
freopen("in.txt","r",stdin);
cin >>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin >> a[i][j];
findP();
cout<< b[1][1]<<endl;
cout << a[1][1];
int temp = b[1][1]-a[1][1];
for(int i=2;i<=n;i++)
{
for(int j=i;j>=1;j--) //靠右的路径优先
{
if(b[i][j]==temp) //一一匹配
{
cout << " " <<a[i][j];
temp-=a[i][j]; //更新每一层的匹配值
break; //进入下一层循环
}
}
}
return 0;
}
- 10303 数字三角
- 数字三角
- 数字三角
- 数字三角
- 数字三角
- 数字三角
- 10303 数字三角(动态规划)
- 数字三角开问题
- 数字三角问题
- SCU_1114_数字三角
- SCU_1114_数字三角
- SCU 1114 数字三角
- 递归求三角数字
- SCU 1114 数字三角
- DP-数字三角
- 输出数字三角阵
- dp-- 数字三角
- 递归-A-三角数字
- 8602 区间相交问题
- 11077 最长公共子字符串
- CSDN的博客积分规则及博客排名规则
- 欢迎使用CSDN-markdown编辑器
- C/C++ 类型自动转换规则
- 10303 数字三角
- Android-adapter的用法
- mysql简单备份与恢复
- 动态规划之01背包问题(最易理解的讲解)
- C查看分配给用户的内存及分配给系统的内存大小
- 使用hibernate运行产生的红字解决方法,虽然不影响,但是看着不爽
- VS2013(Win10X64)-配置编译Caffe
- Delphi 常用函数记录
- [LeetCode]Evaluate Reverse Polish Notation