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;}
一开始用指针写的,我真是被数据结构毒害了。。。。