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

hicc0305

2017-07-17 15:52:35

Solution

一道简单的矩阵dp题目,用dp[i][j]存储到i,j这个点的最大值,从下到上递推出第一列的最大值,在比较一下就可以了 转移方程见程序,注意一些地方是死角,走不到,不用加进去。(PS:不知为什么数组开201,201过不了……多开一点才过) ```cpp #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m; int a[401][401]; int dp[401][401]; int main() { memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); for(int i=m+1;i>=2;i--)//从最后一行的下一列开始 { int l=n/2+1-(m-i+1),r=n/2+1+(m-i+1);//要枚举j左右值,也就把走不到的地方排出了 for(int j=max(l,1);j<=min(r,n);j++) { dp[i-1][j-1]=max(dp[i-1][j-1],dp[i][j]+a[i-1][j-1]); dp[i-1][j]=max(dp[i-1][j],dp[i][j]+a[i-1][j]); dp[i-1][j+1]=max(dp[i-1][j+1],dp[i][j]+a[i-1][j+1]);//转移方程,可能有点麻烦,但不用脑子 } } int ans=0; for(int i=1;i<=n;i++) ans=max(ans,dp[1][i]);//比较求最值 printf("%d",ans); return 0; } ```