zoukankan      html  css  js  c++  java
  • 数字金字塔解题报告

    用二维数组记录数,每一个数a[i][k]对应的下两个数是a[i+1][k]和a[i+1][k+1]
    队列数组也可以

    记忆化搜索

    从下往上讨论
    DP==从下往下讨论

    DP, f[i][k]从塔顶到此处的最大路径
    引申滚动数组

     1 #include <cstdio>
     2 using namespace std;
     3 #define maxr 1001
     4 int a[maxr][maxr];
     5 bool f[maxr][maxr];
     6 int r;
     7 int max(int a, int b)
     8 {
     9     if(a>b)    return a;
    10     return b;
    11 }
    12 void dfs(int i, int k)
    13 {
    14     if(i==r)    return;
    15     if(f[i+1][k]==0)
    16     {
    17         dfs(i+1, k);
    18         f[i+1][k]=1;
    19     }
    20     if(k<=i&&f[i+1][k+1]==0)    
    21     {
    22         dfs(i+1, k+1);
    23         f[i+1][k+1]=1;
    24     }
    25     a[i][k]+=max(a[i+1][k],a[i+1][k+1]);
    26 }
    27 int main()
    28 {
    29     int i, k;
    30     scanf("%d", &r);
    31     for(i=1; i<=r; i++)
    32     {
    33         for(k=1; k<=i; k++)
    34         {
    35             scanf("%d", &a[i][k]);
    36         }
    37     }
    38     for(i=1; i<=r; i++)    f[r][i]=1;
    39     dfs(1, 1);
    40     printf("%d", a[1][1]);
    41     return 0;
    42 }
    记忆化
     1 #include <cstdio>
     2 using namespace std;
     3 #define maxr 1001
     4 int max(int a, int b)
     5 {
     6     if(a>b)    return a;
     7     return b;
     8 }
     9 int a[maxr][maxr];
    10 int main()
    11 {
    12     int r, i, k;
    13     scanf("%d", &r);
    14     for(i=1; i<=r; i++)
    15     {
    16         for(k=1; k<=i; k++)
    17         {
    18             scanf("%d", &a[i][k]);
    19         }
    20     }
    21     for(i=r-1; i>=1; i--)
    22     {
    23         for(k=1; k<=i; k++)
    24         {
    25             a[i][k]+=max(a[i+1][k], a[i+1][k+1]);
    26         }
    27     }
    28     printf("%d", a[1][1]);
    29     return 0;
    30 }
    从下往上讨论
     1 #include <cstdio>
     2 using namespace std;
     3 #define maxr 1001
     4 int max(int a, int b)
     5 {
     6     if(a>b)    return a;
     7     return b;
     8 }
     9 int a[maxr][maxr];
    10 int main()
    11 {
    12     int r, i, k, ans=0;
    13     scanf("%d", &r);
    14     for(i=1; i<=r; i++)
    15     {
    16         for(k=1; k<=i; k++)
    17         {
    18             scanf("%d", &a[i][k]);
    19             a[i][k]+=max(a[i-1][k-1], a[i-1][k]);
    20             ans=max(a[i][k], ans);
    21         }
    22     }
    23     printf("%d", ans);
    24     return 0;
    25 }
    DP, f[i][k]从塔顶到此处的最大路径
     1 #include <cstdio>
     2 using namespace std;
     3 #define maxr 1001
     4 int max(int a, int b)
     5 {
     6     if(a>b)    return a;
     7     return b;
     8 }
     9 int a[2][maxr];
    10 int main()
    11 {
    12     int r, i, k, ans=0, ri, pi;
    13     scanf("%d", &r);
    14     for(i=1; i<=r; i++)
    15     {
    16         ri=i%2;
    17         pi=!ri;
    18         for(k=1; k<=i; k++)
    19         {
    20             scanf("%d", &a[ri][k]);
    21             a[ri][k]+=max(a[pi][k-1], a[pi][k]);
    22             ans=max(a[ri][k], ans);
    23         }
    24     }
    25     printf("%d", ans);
    26     return 0;
    27 }
    滚动数组
  • 相关阅读:
    VC++6.0在win8.1系统下运行失败的解决办法
    oracle赋值问题(将同一表中某一字段赋值给另外一个字段的语句)
    Myeclipse 2014破解教程
    关于js赋值给input解析
    java时间格式
    Idea报错Check $M2_HOME environment variable and mvn script match.
    新博客
    理解jquery的$.extend()、$.fn和$.fn.extend()
    在vs code中使用ftp-sync插件实现客户端与服务器端代码的同步
    js字符串倒序
  • 原文地址:https://www.cnblogs.com/formiko/p/4418071.html
Copyright © 2011-2022 走看看