POJ 3176 Cow Bowling dp, 贪心
题意:从顶点走到最底,第 map[i][j] 层位置到第 i+1 层,只能走map[i+1][j] 或者是 map[i+1][j+1].
思路:简单DP, 倒推上去, 求走到第 map[i][j] 这个位置的最大值, 那么 map[i][j] = GetMax(map[i-1][j] , map[i-1][j-1]);
11040124 | NY_lv10 | 3176 | Accepted | 892K | 157MS | C++ | 828B | 2012-11-22 18:34:33 |
View Code
1 #include <iostream> 2 using namespace std; 3 4 int maxx; 5 int map[400][400]; 6 int n; 7 8 //void dfs(int i, int j, int sum) //递归超时 9 //{ 10 // 11 // if (j< 0 || sum + (n-i)*99 <= maxx) 12 // return ; 13 // if (i == n) 14 // { 15 // if (maxx <sum) 16 // maxx = sum; 17 // return ; 18 // } 19 // dfs(i+1, j+1, sum+map[i][j]); 20 // dfs(i+1, j, sum+map[i][j]); 21 //} 22 23 int GetMax(int a, int b) 24 { 25 return a > b ? a : b; 26 } 27 28 29 int main() 30 { 31 32 int i, j; 33 while (cin>>n) 34 { 35 maxx = 0; 36 memset(map, 0, sizeof(map)); 37 for (i=1; i<=n; i++) //i从0开始就错.....不知道为毛!! 38 { 39 for (j=1; j<=i; j++) 40 { 41 cin>>map[i][j]; 42 } 43 } 44 // dfs(0, 0, 0); 45 //maxx = map[0][0]; 46 for (i=1; i<=n; i++) 47 { 48 for (j=1; j<=i; j++) 49 { 50 map[i][j] += GetMax(map[i-1][j], map[i-1][j-1]); 51 if (map[i][j] > maxx) 52 maxx = map[i][j]; 53 } 54 } 55 cout<<maxx<<endl; 56 } 57 }