SCU 1114:数字三角(动态规划)
2017-08-03 21:00
281 查看
数字三角
Time limit:20000 ms Memory limit:1048576 kB下图是个数字三角,请编写一个程序计算从顶部至底部某处一条路径,使得该路径所经过的数字总和最大。 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
解题思路:
经典的动态规划,关键在于输出一个可能的解判断dp[i-1][j]-dp[i][j]==a[i-1][j]成立就是a[i-1][j]否则就是a[i][j+1]
Code:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int maxn=105; int a[maxn][maxn]; int dp[maxn][maxn]; int main() { int n; while(cin>>n) { mem(a,0); mem(dp,0); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) cin>>a[i][j]; for(int i=1;i<=n;i++) dp [i]=a [i]; for(int i=n-1;i>=1;i--) for(int j=1;j<=i;j++) dp[i][j]=a[i][j]+max(dp[i+1][j],dp[i+1][j+1]); cout<<dp[1][1]<<endl; cout<<a[1][1]<<' '; int j=1; for(int i=2;i<=n;i++) { if(dp[i-1][j]-dp[i][j]==a[i-1][j]) { cout<<a[i][j]; } else { cout<<a[i][j+1]; j++; } if(i==n) cout<<endl; else cout<<' '; } } return 0; }
相关文章推荐
- SCU 1114-数字三角(dp)
- SCU-1114数学三角 (动态规划)
- SCU 1114 数字三角
- (SCU - 1114 )数字三角
- SCU_1114_数字三角
- SCU_1114_数字三角
- SCU 1114 数字三角
- 动态规划 基础题 数字三角
- 10303 数字三角(动态规划)
- 将数字格式设置为文本格式,并使其出现左上角绿色小三角
- 递归求三角数字
- DP-数字三角
- |Tyvj|动态规划|P1044 数字三角形
- 求左边数字减去右边数字的最大差-动态规划
- 算法训练 数字三角形 (动态规划)
- 洛谷Oj-数字三角形-动态规划
- 数字三角形 (动态规划与递归)
- Decode Ways 将数字转化为字母 动态规划 特殊情况处理(重)
- HDU2084(数字三角dp)
- poj3176Cow Bowling,数字三角形,动态规划