The Triangle  http://poj.org/problem?id=1163

暴力dfs的话,每个节点有两条路可以走,那么n个节点复杂度就是2^n  n=100  超时   dp来做 就优化成 n^2

记忆化搜索,就能优化成n^2 因为一个点最多算一次,以后会直接返回dp i j 。 dp i j 表示这个位置能获得最大值。最后一行就是a i j  ,其他行都可以由下面两条路取最大值。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define mt(a,b) memset(a,b,sizeof(a))
 5 using namespace std;
 6 const int M=128;
 7 int n,a[M][M],dp[M][M];
 8 int dfs(int i,int j){
 9     if(~dp[i][j]) return dp[i][j];
10     if(i==n) dp[i][j]=a[i][j];
11     else     dp[i][j]=max(dfs(i+1,j),dfs(i+1,j+1))+a[i][j];
12     return dp[i][j];
13 }
14 int main(){
15     while(~scanf("%d",&n)){
16         for(int i=1;i<=n;i++){
17             for(int j=1;j<=i;j++){
18                 scanf("%d",&a[i][j]);
19             }
20         }
21         mt(dp,-1);
22         printf("%d\n",dfs(1,1));
23     }
24     return 0;
25 }
View Code

相关文章: