SCU 1114-数字三角(dp)
2016-02-28 20:18
267 查看
B - 数字三角Time Limit:0MS Memory Limit:0KB 64bit IO Format:%lld& %lluSubmit Status Practice SCU1114Appoint description: System Crawler (2016-02-24)Description下图是个数字三角,请编写一个程序计算从顶部至底部某处一条路径,使得该路径所经过的数字总和最大。73 88 1 02 7 4 41. 每一步可沿左斜线向下或右斜线向下走;2. 1<=三角形行数<=1003. 三角形中的数字为整数 0,1,……,99。4. 如果有多种情况结果都最大,任意输出一种即可。 输入:第一行一个整数N,代表三角形的行数。接下来N行,描述了一个数字三角。 输出: 第一行一个整数,代表路径所经过底数字总和。 第二行N个数,代表所经过的数字。 样例:输入:4 73 88 1 02 7 4 4输出:25 7 3 8 7
这题的最大值容易求出来,但是那个顺序比较难弄一开始弄错了,所以无数wa
#include<iostream>#include<algorithm>#include<cstring>#include<string>#include<cstdio>#include<cmath>#include<ctime>#include<cstdlib>#include<queue>#include<vector>#include<set>using namespace std;const int T=500;#define inf 0x3f3f3f3fLtypedef long long ll;struct node{int dp[T][T];int d[T][T];int vis[T][T];}a;int main(){#ifdef zscfreopen("input.txt","r",stdin);#endifint n,i,j,k;while(~scanf("%d",&n)){for(i=0;i<n;++i){for(j=0;j<=i;++j){scanf("%d",&a.dp[i][j]);a.d[i][j] = a.dp[i][j];if(i==n-1){a.vis[i][j] = j+1;}}}for(i=n-2;i>=0;--i){for(j=0;j<=i;++j){if(a.dp[i+1][j]>=a.dp[i+1][j+1]){a.dp[i][j] = a.dp[i+1][j]+a.dp[i][j];a.vis[i][j] = j;} else {a.dp[i][j] = a.dp[i+1][j+1]+a.dp[i][j];a.vis[i][j] = j+1;}}}printf("%d\n%d ",a.dp[0][0],a.d[0][0]);for(i=1,k=0;i<n;++i){k = a.vis[i-1][k];printf("%d ",a.d[i][k]);}printf("\n");}return 0;}
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- 动态规划
- C++ 动态规划
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- DP(动态规划) 解游轮费用问题
- Android对px和dip进行尺寸转换的方法
- 动态规划的用法——01背包问题
- 动态规划的用法——01背包问题
- 《收集苹果》 动态规划入门
- 《DNA比对》蓝桥杯复赛试题
- 《背包问题》 动态规划
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207