• COJ 0034 动态的数字三角形


    题解:简单dp吧。

    自顶向下的写法:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<cstring>
     7 #define PAU putchar(' ')
     8 #define ENT putchar('
    ')
     9 using namespace std;
    10 const int maxn=1000+10;
    11 int a[maxn][maxn],n,cnt=1;
    12 bool vis[maxn][maxn];
    13 inline int read(){
    14     int x=0,sig=1;char ch=getchar();
    15     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
    16     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
    17     return x*=sig;
    18 }
    19 inline void write(int x){
    20     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    21     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
    22     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    23 }
    24 int solve(int x,int y){
    25     if(vis[x][y]||x==n) return a[x][y];
    26     vis[x][y]=true;
    27     a[x][y]+=max(solve(x+1,y),solve(x+1,y+1));return a[x][y];
    28 }
    29 void init(){
    30     n=read();
    31     for(int i=1;i<=n;i++)
    32         for(int j=1;j<=i;j++)
    33             a[i][j]=read();
    34     write(solve(1,1));
    35     return;
    36 }
    37 void work(){
    38     return;
    39 }
    40 void print(){
    41     return;
    42 }
    43 int main(){init();work();print();return 0;}

    自底向上的写法:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<cstring>
     7 #define PAU putchar(' ')
     8 #define ENT putchar('
    ')
     9 using namespace std;
    10 const int maxn=1000+10;
    11 int a[maxn][maxn],n,ans=-1;
    12 bool vis[maxn][maxn];
    13 inline int read(){
    14     int x=0,sig=1;char ch=getchar();
    15     while(!isdigit(ch)){if(ch=='-')sig=-1;ch=getchar();}
    16     while(isdigit(ch))x=10*x+ch-'0',ch=getchar();
    17     return x*=sig;
    18 }
    19 inline void write(int x){
    20     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    21     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
    22     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    23 }
    24 void init(){
    25     n=read();
    26     for(int i=1;i<=n;i++)
    27         for(int j=1;j<=i;j++)
    28             a[i][j]=read();
    29     for(int i=2;i<=n;i++) for(int j=1;j<=i;j++) a[i][j]+=max(a[i-1][j],a[i-1][j-1]);
    30     for(int i=1;i<=n;i++) if(ans<a[n][i]) ans=a[n][i];
    31     write(ans);
    32     return;
    33 }
    34 void work(){
    35     return;
    36 }
    37 void print(){
    38     return;
    39 }
    40 int main(){init();work();print();return 0;}

    一开始用指针写的,我真是被数据结构毒害了。。。。

  • 相关阅读:
    e667. 在给定图像中创建缓冲图像
    e661. 确定图像中是否有透明像素
    e673. Getting Amount of Free Accelerated Image Memory
    e663. 在gif图像中获取透明和色彩的数量
    e662. 取的图像的色彩模型
    e675. 翻转缓冲图像
    e665. 在图像中过滤三元色
    e679. 浮雕化图像
    e669. 绘制缓冲图像
    e664. 在图像中获取子图像
  • 原文地址:https://www.cnblogs.com/chxer/p/4591814.html
Copyright © 2020-2023  润新知