#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int dp[510],save[510][510],m,n;
int main()
{
while(~scanf("%d%d", &n,&m))
{
memset(dp, 0, sizeof(dp));
memset(save, 0, sizeof(save));
for(int i =3; i<n+3; i++)
for(int j =3; j<m+3; j++)
{
scanf("%d", &save[i][j]);
save[i][j]+=max(save[i][j-2],save[i][j-3]);
}
for(int i =3; i<n+3; i++)
dp[i]=max(dp[i-2],dp[i-3])+max(save[i][m+1],save[i][m+2]);
printf("%d\n", dp[n+2]);
}
return 0;
}
第二种方法
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stack>
using namespace std;
int dp[520],map[520];
int main()
{
int n,m;
while(~scanf("%d%d", &n, &m))
{
memset(dp,0,sizeof(dp));
memset(map,0,sizeof(map));
for(int i =1; i<=n; i++)
{
scanf("%d", &dp[1]);
for(int j =2; j<=m; j++)
{
int t;
scanf("%d", &t);
dp[j]=max(dp[j-1],dp[j-2]+t);
}
map[i]=dp[m];
}
dp[1]=map[1];
for(int i =2;i<=n; i++)
{
dp[i]=max(dp[i-1],dp[i-2]+map[i]);
}
printf("%d\n", dp[n]);
}
return 0;
}