The Triangle
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 50890 Accepted: 30823 Description
Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right. 7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(Figure 1)Input
Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.Output
Your program is to write to standard output. The highest sum is written as an integer.Sample Input
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5Sample Output
30
数字三角形。
f[i][j] = max(f[i - 1][j], f[i - 1][j - 1]) + a[i][j]


1 #include <cstdio> 2 #include <algorithm> 3 4 using namespace std; 5 6 int n, f[200][200], ans; 7 8 int main() { 9 scanf("%d", &n); 10 for(int i = 1 ; i <= n ; i ++) { 11 for(int j = 1 ; j <= i ; j ++) { 12 scanf("%d", &f[i][j]); 13 f[i][j] += max(f[i - 1][j], f[i - 1][j - 1]); 14 if(i == n) { 15 ans = max(ans, f[i][j]); 16 } 17 } 18 } 19 printf("%d\n", ans); 20 }
如果要强制经过某一点(x, y)?
a[x][y] += INF
答案再减去INF就行
如果禁止进过某一点?
减去INF就行
本文介绍了一个经典的动态规划问题——数字三角形最高路径求和。通过递推公式 f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j],从上到下计算每一步的最大路径和,最终找到从顶部到底部的最大路径总和。
471

被折叠的 条评论
为什么被折叠?



