题源:poj1163:http://poj.org/problem?id=1163
题意:该题的意思是给一个三角形,找出从三角形最顶上走到最低边的一条加权最大的路之和(只能一直往下走)
我的方法是从自底向上找,用一个数组存三角形最后一行的数,再一行一行往上找,找到最大的和更新数组的值,最后数组的第一个数就是最终值。每个点只标记一次,一共n*(n-1)/2个点,
时间复杂度O(n*n(n-1)/2)
代码:
1 /* 2 5 3 7 4 3 8 5 8 1 0 6 2 7 4 4 7 4 5 2 6 5 8 */ 9 10 #include <bits/stdc++.h> 11 using namespace std; 12 const int maxn = 1010; 13 14 int dp[maxn][maxn]; 15 int *s; 16 17 int main() 18 { 19 int t; 20 int i,j; 21 cin >> t; 22 for(i = 0;i < t;++i){ 23 for(j = 0;j < i+1;++j){ 24 scanf("%d",&dp[i][j]); 25 } 26 } 27 s = dp[t-1]; 28 for(i = t-2;i >= 0;--i){ 29 for(j = 0;j < i+1;++j){ 30 s[j] = max(dp[i][j]+s[j],s[j+1]+dp[i][j]); 31 } 32 } 33 cout << s[0] << endl; 34 return 0; 35 }