P1044数字三角形
描述
示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
径,使该路径所经过的数字的总和最大。
每一步可沿左斜线向下或右斜线向下走;
1<三角形行数<25;
三角形中的数字为整数<1000;
径,使该路径所经过的数字的总和最大。
每一步可沿左斜线向下或右斜线向下走;
1<三角形行数<25;
三角形中的数字为整数<1000;
输入格式
第一行为N,表示有N行
后面N行表示三角形每条路的路径权
后面N行表示三角形每条路的路径权
输出格式
路径所经过的数字的总和最大的答案
测试样例1
输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出
30
复制过来自配边框下划线我也是醉了。。。。
动归的题目,貌似很经典很基础~我是从下往上每次取最大的然后加成和,最后(1,1)所在的便是最大路径和。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #define MAXN 1000 using namespace std; int a[MAXN][MAXN], b[MAXN][MAXN]; //a用来存原数组,b用来存和 int main() { int n; scanf("%d", &n); for(int i=1; i<=n; i++) { for(int j=1; j<=i; j++) //因为是三角形的所以j<=i; { scanf("%d", &a[i][j]); } } for(int i=1; i<=n; i++) { b[n][i] = a[n][i]; } for(int i=n-1; i>=1; i--) { for(int j=1; j<=i; j++) { if(b[i+1][j+1] > b[i+1][j]) { b[i][j] = b[i+1][j+1] + a[i][j]; //注意加上原数组的值 } else b[i][j] = b[i+1][j] + a[i][j]; } } printf("%d", b[1][1]); return 0; }
P1076数字三角形2
描述
数字三角形
要求走到最后mod 100最大输入格式
第1行n,表示n行 <=25
第2到n+1行为每个的权值输出格式
mod 100最大值默默地说。。有一种被嵌套的赶脚。。。。测试样例1
输入
2
1
99 98输出
99其实就只有这个没太看懂题目,简短有力啊,都把我整蒙了。。。直接贴代码好了。。。#include <stdio.h> int map[30][30], N, max = 0, M[30][30]; int dfs(int n, int m, int add) { int i, j; if(n == N) { if(max < add % 100) max = add % 100; } else if(n < N) { dfs(n + 1, m, add + map[n][m]); dfs(n + 1, m + 1, add + map[n][m]); } } int main() { int i, j; scanf("%d", &N); for(i = 0; i < N; i++) { for(j = 0; j < i + 1; j++) scanf("%d", &map[i][j]); } dfs(0, 0, 0); printf("%d\n", max); return 0; }
P1079数字三角形3
描述
数字三角形必须经过某一个点,使之走的路程和最大输入格式
第1行n,表示n行 <=25
第2到n+1行为每个的权值
程序必须经过n div 2,n div 2这个点输出格式
最大值测试样例1
输入
2
1
1 1输出
2做了数字三角形1之后,这道就很好做啦,只要想一想三角形和必经过的一点之间的关系,把经过点的下面缩小成一个小三角形就ok啦
eg:4行的三角形 (2,2)点为必须经过的,即下面红色的数字~三角形里面紫色的部分就是经过2后
可以取到的数字,而绿色的就是必须要取到的才能经过2~形成的三角形: 数组中的储存状况:
1 11 2 1 21 2 3 1 2 31 2 3 4 1 2 3 4
代码:
#include <iostream> #include <cstdio> #include <cstring> #define MAXN 1000 using namespace std; int a[MAXN][MAXN], b[MAXN][MAXN]; //a存原始三角形 , b存和 int main() { int n; scanf("%d", &n); for(int i=1; i<=n; i++) { for(int j=1; j<=i; j++) { scanf("%d", &a[i][j]); } } for(int i=n; i>=1; i--) { b[n][i] = a[n][i]; } for(int i=n-1; i>=n/2; i--) //注意必经过的点是n/2, { for(int j=n/2; j<=i; j++) { if(b[i+1][j+1] > b[i+1][j]) { b[i][j] = b[i+1][j+1] + a[i][j]; } else b[i][j] = b[i+1][j] + a[i][j]; } } for(int i=n/2-1; i>=1; i--) { b[i][i] = b[i+1][i+1] + a[i][i]; } printf("%d\n", b[1][1]); return 0; }
P1084数字三角形4
描述
数字三角形必须经过某一个点,使之走的路程和最大输入格式
第1行n,表示n行 <=25
第2到n+1行为每个的权值
第n+2行为两个数x,y表示必须经过的点输出格式
最大值和上面的差不太多,就是需要考虑上下分别用动归~测试样例1
输入
2
1
1 1
1 1输出
2
代码:
#include <iostream> #include <cstdio> #include <cstring> #define MAXN 1000 using namespace std; int a[MAXN][MAXN], b[MAXN][MAXN], c[MAXN][MAXN]; int main() { int n; scanf("%d", &n); for(int i=1; i<=n; i++) { for(int j=1; j<=i; j++) { scanf("%d", &a[i][j]); } } int x, y; scanf("%d%d", &x, &y); for(int i=n; i>=x; i--) //下三角 { for(int j=1; j<=i; j++) { b[i][j] = max(b[i+1][j], b[i+1][j+1]) + a[i][j]; } } for(int i=1; i<=x; i++) //上三角 { for(int j=1; j<=i; j++) { c[i][j] = max(c[i-1][j], c[i-1][j-1]) + a[i][j]; } } int result = b[x][y] + c[x][y] - a[x][y]; //这个a[x][y]加了两次,要减掉~ printf("%d\n", result); return 0; }
对了~~Merry Christmas!!! *<<<<+>_< 嘻嘻 ~~