题意:容易理解。
分析:以后碰到这种类型的题,就要考虑把矩阵先按行来处理,再按列处理。先算出每行能够能够得到的最大值,然后按列处理即可。
代码实现:
#include<stdio.h> #include<string.h> int n,m; int a[200005],dp[200005][2],b[200005]; int max(int x,int y) { return x>y?x:y; } int main() { int i,j,res; while(scanf("%d%d",&n,&m)!=EOF) { res=-1000000; dp[0][0]=0;dp[0][1]=0; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&a[j]); dp[j][0]=max(dp[j-1][0],dp[j-1][1]); dp[j][1]=dp[j-1][0]+a[j]; } b[i]=max(dp[m][0],dp[m][1]); if(res<b[i]) res=b[i]; } dp[0][0]=0;dp[0][1]=0; for(i=1;i<=n;i++) { dp[i][0]=max(dp[i-1][0],dp[i-1][1]); dp[i][1]=dp[i-1][0]+b[i]; if(res<dp[i][0]) res=dp[i][0]; if(res<dp[i][1]) res=dp[i][1]; } printf("%d ",res); } return 0; }