POJ 1163:The Triangle
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,直接记录状态
dp[i][j]表示以第i行第j列开头的三角形的最大值
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];
(1) 从后向前递推
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int MAXN = 1001; 5 int dp[MAXN][MAXN]; 6 int main() 7 { 8 int n; 9 cin >> n; 10 for (int i = 0; i < n;i++) 11 for (int j = 0; j <= i; j++) 12 cin >> dp[i][j]; 13 for (int i = n - 2; i >= 0;i--) 14 for (int j = 0; j <= i; j++) 15 { 16 dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) + dp[i][j]; 17 } 18 cout << dp[0][0]; 19 return 0; 20 }
(2) 从前向后递推
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int MAXN = 1001; 5 int dp[MAXN][MAXN]; 6 int main() 7 { 8 int n; 9 cin >> n; 10 for (int i = 0; i < n;i++) 11 for (int j = 0; j <= i; j++) 12 cin >> dp[i][j]; 13 for (int i = 0; i < n;i++) 14 for (int j = 0; j <= i; j++) 15 { 16 if (i==0)continue; 17 else if (j == 0)dp[i][j] = dp[i-1][j] + dp[i][j]; 18 else if (j == i)dp[i][j] = dp[i-1][j-1] + dp[i][j]; 19 else dp[i][j] = max(dp[i-1][j],dp[i-1][j-1]) + dp[i][j]; 20 } 21 int ans = 0; 22 for (int j = 0; j < n; j++) 23 ans = max(ans,dp[n-1][j]); 24 cout << ans; 25 return 0; 26 }