SCU_1114_数字三角
来源:互联网 发布:java 热替换 匿名类 编辑:程序博客网 时间:2024/05/18 03:47
Description
下图是个数字三角,请编写一个程序计算从顶部至底部某处一条路径,使得该路径所经过的数字总和最大。
7
3 8
8 1 0
2 7 4 4
1. 每一步可沿左斜线向下或右斜线向下走;
2. 1<=三角形行数<=100
3. 三角形中的数字为整数 0,1,……,99。
4. 如果有多种情况结果都最大,任意输出一种即可。
输入:
第一行一个整数N,代表三角形的行数。
接下来N行,描述了一个数字三角。
输出:
第一行一个整数,代表路径所经过底数字总和。
第二行N个数,代表所经过的数字。
样例:
输入:
4
7
3 8
8 1 0
2 7 4 4
输出:
25
7 3 8 7
基础的动态规划问题,这个题点在把最大值的路径输出来,我用的方法是在搜索最大值的同时,把相应的行号列号也存起来,
这样的话输出路径就可以循着线索找了
#include <iostream>
#include <stdio.h>
#include <string.h>
struct node
{
int z,x,y;
};
const int maxn=110;
node dp[maxn][maxn];
using namespace std;
int a[maxn][maxn];
int max(node a,node b)
{
return a.z>b.z?a.z:b.z;
}
void solve(int i,int j,int n)
{
for(j=1;j<=n;j++) {
dp[n][j].z=a[n][j];
dp[n][j].x=n;
dp[n][j].y=j;
}
for(i=n-1;i>=1;i--)
{
for(j=1;j<=n;j++)
{
dp[i][j].z=a[i][j]+max(dp[i+1][j].z,dp[i+1][j+1].z);
if(dp[i+1][j].z>=dp[i+1][j+1].z)
{
dp[i][j].x=i+1;
dp[i][j].y=j;
}
else
{
dp[i][j].x=i+1;
dp[i][j].y=j+1;
}
}
}
/*for(i=n;i>=1;i--)
{
for(j=1;j<=n;j++)
{
cout<<dp[i][j].x<<" "<<dp[i][j].y<<" ";
}
cout<<endl;
}*/
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++) scanf("%d",&a[i][j]);
solve(1,1,n);
printf("%d\n",dp[1][1].z);
int i,j;
cout<<a[1][1]<<" ";
i=dp[1][1].x;
j=dp[1][1].y;int a1,b;
for(int p=1;p<=n-1;p++)
{
a1=i;b=j;
cout<<a[i][j]<<" ";
i=dp[a1][b].x;
j=dp[a1][b].y;
}printf("\n");
}
return 0;
}
- SCU_1114_数字三角
- SCU_1114_数字三角
- 数字三角
- 数字三角
- 数字三角
- 数字三角
- 数字三角
- 数字三角开问题
- 数字三角问题
- 10303 数字三角
- SCU 1114 数字三角
- 递归求三角数字
- SCU 1114 数字三角
- DP-数字三角
- 输出数字三角阵
- dp-- 数字三角
- 递归-A-三角数字
- 利用递归计算三角数字
- EntityFrameWork学习
- Android DataBinding:再见Presenter,你好ViewModel!
- 向数组中循环添加内容
- Android性能优化典范
- Oracle语句优化规则汇总(7)
- SCU_1114_数字三角
- Visual Studio 中统计代码行数
- 【sql】oracle 数据库instr函数的用法详解
- 小心jstl标签、EL表达式中的空格陷阱
- Ubuntu桌面版搭建单机版CloudFoundry
- win10 ISO镜像下载
- LLSimpleCamera V8HorizontalPickerView
- Hadoop HBase 配置 安装 Snappy 终极教程
- PHP生成不重复随机数的方法汇总