The Triangle
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 41532 | Accepted: 25115 |
Description
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 5
Sample Output
30
简单DP,用二维数组
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<ctype.h> #include<stdlib.h> #include<string> #include<algorithm> #include<vector> #include<set> #include<map> #include<list> #include<queue> #include<stack> #include<iomanip> #include<numeric> #include <istream> //基本输入流 #include <ostream> //基本输出流 #include <sstream> //基于字符串的流 #include <utility> //STL 通用模板类 #include <complex.h> //复数处理 #include <fenv.h> //浮点环境 #include <inttypes.h> //整数格式转换 #include <stdbool.h> //布尔环境 #include <stdint.h> //整型环境 #include <tgmath.h> //通用类型数学宏 #define L(a,b,c) for(int a = b;a >= c;a --) #define M(a,b,c) for(int a = b;a < c;a ++) #define N(a,b) memset(a,b,sizeof(a)); const int MAX=100000000; const int MIN=-MAX; typedef int T; typedef double D; typedef char C; using namespace std; int a[100][100]; int s(int& n) { L(i,n-2,0) M(j,0,i+1) if(a[i+1][j]>a[i+1][j+1]) a[i][j]+=a[i+1][j]; else a[i][j]+=a[i+1][j+1]; return a[0][0]; } int main() { int n; while(~scanf("%d",&n)) { N(a,0) M(i,0,n) M(j,0,i+1) scanf("%d",&a[i][j]); s(n); printf("%d\n",a[0][0]); } }
用一维数组
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<ctype.h> #include<stdlib.h> #include<string> #include<algorithm> #include<vector> #include<set> #include<map> #include<list> #include<queue> #include<stack> #include<iomanip> #include<numeric> #include <istream> //基本输入流 #include <ostream> //基本输出流 #include <sstream> //基于字符串的流 #include <utility> //STL 通用模板类 #include <complex.h> //复数处理 #include <fenv.h> //浮点环境 #include <inttypes.h> //整数格式转换 #include <stdbool.h> //布尔环境 #include <stdint.h> //整型环境 #include <tgmath.h> //通用类型数学宏 #define L(a,b,c) for(int a = b;a >= c;a --) #define M(a,b,c) for(int a = b;a < c;a ++) #define N(a,b) memset(a,b,sizeof(a)); const int MAX=100000000; const int MIN=-MAX; typedef int T; typedef double D; typedef char C; using namespace std; int a[100][100]; int *p; int main() { int n; while(~scanf("%d",&n)) { M(i,0,n) M(j,0,i+1) cin>>a[i][j]; p=a[n-1]; L(i,n-2,0) M(j,0,n) p[j]=max(p[j],p[j+1])+a[i][j]; cout<<p[0]<<endl; } }