POJ 1163 The Triangle DP 逐点累加
题意:给定一个三角数组,从top(顶) 往下走走到base(脚)求一个路线,把这些路线的数字加起来和最大。可以走左下和右下。
思路:说是动态规划,但是我第一个想到的是逐点累加法,在triangle[i][j] 下一步只能是走triangle[i][j] 或者是triangle[i][j+1]。
那么我们可以逆向走,即从底部往上走,那么这样就很明显的知道在第k层的 i 点,选择下一步的点当然是Maxx([k+1][i], [k+1][i+1]),因为是求最大值。
1 #include <iostream> 2 using namespace std; 3 4 const int N = 105; 5 int triangle[N][N]; 6 7 int Maxx(int a, int b) 8 { 9 return a < b ? b : a; 10 } 11 12 int main() 13 { 14 int n, i, j, k; 15 cin>>n; 16 for ( i=0; i<n; i++) 17 for ( j=0; j<=i; j++) 18 cin>>triangle[i][j]; 19 for (k=n-2; k>=0; k--) 20 for (i=0; i<=k; i++) 21 triangle[k][i] += Maxx(triangle[k+1][i], triangle[k+1][i+1]); 22 cout<<triangle[0][0]<<endl; 23 24 return 0; 25 }