题目链接:https://www.luogu.org/problemnew/show/P1508
好迷的一道题啊,一开始题意没理解,原来起点是最后一行的下方,而不是在最后一行上。555,为什么顺推不行,难道是细节问题(需要处理边界)?好吧,我比较懒,改成倒推就对了,以后看哪个简单就用哪个吧。呃呃,其实这道题和数字三角形很相似,不过每次需要考虑三个方向。
1 #include<cstdio> 2 #include<cstring> 3 const int mmax=205,inf=0x3f3f3f3f; 4 int m,n,dp[mmax][mmax],ans; 5 inline int max(int a,int b) { 6 return a>b?a:b; 7 } 8 int main() { 9 scanf("%d%d",&m,&n); 10 memset(dp,-inf,sizeof(dp)); 11 for(int i=1;i<=m;++i) 12 for(int j=1;j<=n;++j) scanf("%d",&dp[i][j]); 13 for(int i=2;i<=m;++i) 14 for(int j=1;j<=n;++j) { 15 int mm=max(dp[i-1][j-1],max(dp[i-1][j],dp[i-1][j+1])); 16 dp[i][j]+=mm; 17 } 18 ans=max(dp[m][n/2],max(dp[m][n/2+1],dp[m][n/2+2])); 19 printf("%d",ans); 20 return 0; 21 }