题解 P1508 【Likecloud-吃、吃、吃】

ShineEternal

2018-07-03 16:21:07

Solution

``` //声明:本代码仅为蒟蒻编写,大佬勿喷 #include<cstdio> #include<cmath> #include<cstring>//在知道头文件的时候尽量一个一个写出来,防止占空间 using namespace std; long long a[210][210],f[210][210];//多开一些,因为初始牛在矩阵外,开小了会越界 int main() { int m,n; memset(f,-0x3f3f3f3f,sizeof(f));//有负数,清成小值 scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { scanf("%lld",&a[i][j]); } }//至此为输入 f[m+1][n/2+1]=0;//牛站的地方(注意是在矩阵外,不要想成在最后一行的中间位置上,所以m+1) for(int i=m;i>=1;i--)//我是倒着循环,这样从最后的m层一直循环的第1层,答案即为f[1][1]到f[1][n]的值 { for(int j=1;j<=n;j++) { f[i][j]=fmax(fmax(f[i+1][j],f[i+1][j+1]),f[i+1][j-1])+a[i][j];//状态转移方程,即为三个方向 } } long long ans=-10000001;//有负值,开较小负数 for(int i=1;i<=n;i++) { if(f[1][i]>ans) ans=f[1][i]; } printf("%lld",ans);//输出 return 0; //注:本代码的long long为保险起见,因为题目并没有说每一个能量的范围 } ```