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 }