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('\n')
 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('\n')
 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;}

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

你可能感兴趣的:(动态)