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
代码如下
1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 5 int tri[102][102]; 6 int sum[102][102]; 7 int dir[][4] = {{1,0},{1,1}}; 8 int n; 9 10 void dfs(int x, int y) { 11 for(int i = 0; i < 2; i++) { 12 int tmpx = x + dir[i][0]; 13 int tmpy = y + dir[i][1]; 14 if(tmpx < n && tmpy >= 0 && tmpy <= tmpx) { 15 if(sum[tmpx][tmpy] < sum[x][y] + tri[tmpx][tmpy]) { 16 sum[tmpx][tmpy] = sum[x][y] + tri[tmpx][tmpy]; 17 dfs(tmpx, tmpy); 18 } 19 } 20 } 21 } 22 23 int main(int argc, char const *argv[]) 24 { 25 //freopen("input.txt","r",stdin); 26 while(scanf("%d",&n) != EOF) { 27 for(int i = 0; i < n; i++) { 28 for(int j = 0; j <= i; j++) { 29 scanf("%d",&tri[i][j]); 30 } 31 } 32 memset(sum, 0, sizeof(sum)); 33 sum[0][0] = tri[0][0]; 34 dfs(0,0); 35 int max = 0; 36 for(int i = 0; i < n; i++) { 37 if(max < sum[n-1][i]) { 38 max = sum[n-1][i]; 39 } 40 } 41 printf("%d\n",max); 42 } 43 return 0; 44 }
这个题和3176基本一致,但把数组扩大后在3176上跑却一直WA,不明白为甚吗
改成dp的代码如下
1 #include <cstdio> 2 #include <string> 3 #include <iostream> 4 using namespace std; 5 6 int n; 7 int bow[352][352] = {0}; 8 9 int main(int argc, char const *argv[]) 10 { 11 //freopen("input.txt","r",stdin); 12 scanf("%d",&n); 13 for(int i = 0; i < n; i++) { 14 for(int j = 0; j <= i; j++) { 15 scanf("%d",&bow[i][j]); 16 } 17 } 18 for(int i = n-2; i >= 0; i--) { 19 for(int j = 0; j <= i; j++) { 20 bow[i][j] = bow[i][j] + max(bow[i+1][j], bow[i+1][j+1]); 21 } 22 } 23 printf("%d\n",bow[0][0]); 24 return 0; 25 }