HDU 2084 数塔(dp)

来源:互联网 发布:mac 打开uvz 编辑:程序博客网 时间:2024/06/16 05:11




http://acm.hdu.edu.cn/showproblem.php?pid=2084







动态规划的简单问题   从下向上依次找到最优解




递推代码:

#include<stdio.h>    int map[110][110];  int ans[110][110];    int max(int a,int b){      if (a>b)          return a;      else          return b;  }     int main (){        int T;      scanf("%d",&T);       while (T--){          int n;          scanf ("%d",&n);          for (int i=1;i<=n;i++){              for (int j=1;j<=i;j++){                  scanf ("%d",&map[i][j]);              }          }          for (int i=1;i<=n;i++){              ans[n][i]=map[n][i];          }           for (int i=n-1;i>=1;i--){              for (int j=1;j<=i;j++){                  ans[i][j]=map[i][j]+max(ans[i+1][j],ans[i+1][j+1]); //状态转移方程               }          }          printf ("%d\n",ans[1][1]);      }      return 0;  }   






记忆化搜索代码:

#include <stdio.h>  #include <string.h>  int map[110][110];  int ans[110][110];  int n;    int max(int a,int b){      if (a>b)          return a;      else          return b;  }     int solve(int i,int j){      if (ans[i][j]>=0)          return ans[i][j];      return ans[i][j]=map[i][j]+(i==n ? 0:max(solve(i+1,j),solve(i+1,j+1)));  }     int main (){        int T;      scanf("%d",&T);             while (T--){            scanf ("%d",&n);          for (int i=1;i<=n;i++){              for (int j=1;j<=i;j++){                  scanf ("%d",&map[i][j]);              }          }          memset(ans,-1,sizeof(ans));          solve(1,1);          printf ("%d\n",ans[1][1]);      }      return 0;  }   




动态规划的简单问题   从下向上依次找到最优解
0 0